4

Je fais des tâches réseau lourdes - télécharger des images (aperçus) - Pour que mon interface principale ne soit pas bloquée, elle l'a fait dans une AsyncTask, je veux les mettre dans une GridView mais je les ai définies l'adaptateur avant la fin de la tâche asynchrone. Une partie du code sera plus helpfullAsyncTask et setAdapter dans les méthodes onCreate

public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.gridview); 
      new LoadAllPictures().execute(); 
      GridView g = (GridView) findViewById(R.id.gridview); 
      g.setAdapter(new ImageAdapter(this)); 
} 

Ainsi, à la fin de la Logcat montre que tout avait été dowloaded mais rien sur mon écran. J'ai essayé de faire la partie setAdapter dans mon AsyncTask mais il me dit que: Only the original thread that created a view hierarchy can touch its views.

Que dois-je faire?

Répondre

6

AsyncTask a une méthode utile que vous pouvez implémenter nommée onPostExecute(). Il est appelé à partir du thread d'interface utilisateur d'origine une fois la tâche terminée. Vous pouvez l'utiliser pour définir l'adaptateur à partir du bon thread.

4

AsyncTask dispose de 3 méthodes de base:

protected void onPreExecute() 
{ 
} 

protected void onPostExecute(Void unused) 
{ 
    // displaying images 
    // set adapter for listview with downloaded items 
} 

protected Void doInBackground(Void... params) 
{ 
    // downloading and time consuming task 
} 

vous pouvez donc écrire g.setAdapter(new ImageAdapter(this)); dans la méthode onPostExecute(Void unused) car à ce moment, les images ont déjà été téléchargés dans la méthode doInBackground().

0

Pour pratique async les télécharger des images et la mise à vues que vous pouvez utiliser très utile et simple bibliothèque Picasso:

Picasso.with(context) 
    .load(url) 
    .placeholder(R.drawable.user_placeholder) 
    .error(R.drawable.user_placeholder_error) 
    .into(imageView); 

Si vous Android Studio et gradle ajoutez juste niveau app fichier gradle:

compile 'com.squareup.picasso:picasso:2.5.2' 

La version la plus récente est disponible au Github.