2011-03-28 3 views
-1

이미지에 대한 정보가 db에서로드되어 사용자 정의 갤러리보기에 표시된 다음 코드가 있습니다. 문제는 AsyncTask의 백그라운드 스레드에있는 갤러리의 OnItemClickListener에 기본 UI 스레드의 일부인 설정을 적용하는 방법을 볼 수 없다는 것입니다. 액티비티를로드 할 때 대화 상자가 튀어 나오지만 멈추고 많은 작업을하고있는 UI 스레드에서 OnItemClickListener를 설정하기 때문에 대화 상자가 작동한다고 생각합니다. 이 문제를 어떻게 해결할 수 있습니까?OnItemClickListener를 사용하여 AsyncTask 내 ProgressDialog 표시기

private class loadTask extends AsyncTask<String, Integer, String>{ 

     ProgressDialog dialog = new ProgressDialog(ActivityGallery.this); 

     @Override 
     protected void onPreExecute(){ 
      b = getIntent().getExtras(); 

      dialog.setMessage("Loading..."); 
      dialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 


      Log.v("SC", "ASYNC GETS HERE!!"); 
      DBHandler handler = new DBHandler(ActivityGallery.this); 
      SQLiteDatabase db = handler.getReadableDatabase(); 

      Cursor c = db.rawQuery("SELECT * FROM images", null); 
      if (c.moveToFirst()) { 
       do { 
        paths.add(c.getString(1)); 
        Log.v("SC", "Cursor: " + c.getString(1)); 
       } while (c.moveToNext()); 
      } 

      c.close(); 
      db.close(); 
      handler.close(); 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... s){ 

     } 

     @Override 
     protected void onPostExecute(String result){ 
      Log.v("SC", "Final Paths: " + paths.toString()); 

      setContentView(R.layout.gallery); 

      gallery = (Gallery) findViewById(R.id.gallery1); 
      gallery.setAdapter(new ImageAdapter(ActivityGallery.this)); 
      gallery.setOnItemClickListener(new OnItemClickListener() { 
       public void onItemClick(AdapterView<?> parent, View v, int position, 
         long id) { 
        selected_image_position = position; 
        GoToShareActivity(); 
       } 
      });  
      dialog.dismiss(); 
     } 
    } 
+0

어디에서이 AsyncTask를 유지 했습니까? 그것은 내부 수업입니까? –

+0

네 자신의 클래스가 아닌 ActivityGallery라는 클래스 내에있다. – SamRowley

+0

확인. 한 가지 해봐 .. setONItemClickListener, setContentView, setAdapter를 부모 클래스에 넣어 라. AsyncTask에서이 모든 것을 설정하지 마라. –

답변

0

GoToShareActivity()가 멈추는 현상이 발생한다고 생각합니다. 기능을 자세히 확인하십시오.

0

GoToShareActivity()는 무엇을합니까?

다른 리소스를 많이 사용하는 작업 인 경우 대화 상자가 정지됩니다. 이는 onPostExecute()이 UI 스레드에서 실행되기 때문입니다.

나는 asynctask와 비슷한 프로그램을 사용하고있다. onPostExecute 내 onItemClickListener() 퍼팅 시도했다 그러나 그것에 무거운 프로세스를 않는 것처럼 대화 상자를 고정하지 않습니다. 대화 상자가 사라진 후에 사용자에게 갤러리를 보여주고 싶은 부분을 이해합니다.

답변 : 거기에 gallery.setOnItemClickListener()를 사용할 수 있지만 onClick()의 ​​실제 실행은 거기에 있어서는 안됩니다.

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    setContentView(R.layout.gallery); //place before your loadTask() 
    . 
    . //your other implementations 
    . 
} 

private OnItemClickListener galleryOnItemClickListener = new OnItemClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     selected_image_position = position; 
     GoToShareActivity(); 
    } 
}; 

private class loadTask extends AsyncTask<String, Integer, String> 
{ 
    . 
    . 
    . 

    protected void onPostExecute(String result) 
    { 
     Log.v("SC", "Final Paths: " +paths.toString()); 

     gallery = (Gallery)findViewById(R.id.gallery1); 
     gallery.setAdapter(new ImageAdapter(ActivityGallery.this)); 
     gallery.setOnItemClickListener(galleryOnItemClickListener); 

     dialog.dismiss(); 
    } 
}