2011-03-28 5 views
-1

J'ai le code suivant dans lequel les informations sur les images sont chargées à partir d'une base de données et affichées dans une vue de galerie personnalisée. Le problème est que je ne peux pas voir un moyen de mettre le paramètre sur le OnItemClickListener pour la galerie dans le thread d'arrière-plan de la tâche Async comme il fait partie du thread principal de l'interface utilisateur (je pense?). Lorsque je charge l'activité, la boîte de dialogue apparaît mais se fige et je pense que c'est parce que je définis le OnItemClickListener dans le thread d'interface utilisateur qui prend beaucoup de travail. Comment puis-je résoudre ce problème?Gel de l'indicateur ProgressDialog dans AsyncTask avec OnItemClickListener

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

Où avez-vous conservé cette tâche asynchrone? Est-ce en classe interne? –

+0

Ouais c'est dans une classe appelée ActivityGallery pas dans sa propre classe. – SamRowley

+0

Ok. faire une chose .. mettre le setONItemClickListener, setContentView, setAdapter dans la classe parente ... Ne pas mettre tout cela dans AsyncTask. –

Répondre

0

Je pense que GoToShareActivity() provoque le gel. Vérifiez cette fonction en détail.

0

Que fait GoToShareActivity()?

S'il s'agit d'une autre opération gourmande en ressources, le dialogue se gèlera. C'est parce que onPostExecute() s'exécute sur le thread UI.

J'ai un programme similaire qui utilise asynctask comme vous le faites. J'ai essayé de mettre mon onItemClickListener() dans onPostExecute mais il ne gèle pas la boîte de dialogue car je ne fais pas de gros processus dedans. Je comprends la partie par laquelle vous voulez montrer la galerie à l'utilisateur après le rejet de la boîte de dialogue. REPONSE: Vous pouvez faire le gallery.setOnItemClickListener() mais l'exécution réelle du onClick() ne devrait pas être là.

@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(); 
    } 
} 
Questions connexes