J'ai une application dans Android et j'essaie de récupérer des photos sur Internet en utilisant un fil AsyncTask
. Le fait est que je récupère ces images dans un loop
donc pour chaque index, je lance un nouveau AsyncTask
thread.Chaque thread renvoie une image (imageView).Aide à la gestion des threads AsynTask
Et voici mon problème:
Les fils lancés renvoient les images asynchorounsly quand je suis en train de la liste qui acces stocke ces images que je reçois ArrayIndexOutofBounds
.
Ceci est mon code:
for(int i=0;i<friends.size();i++)
{
getUserPic(friends.get(i).getId());
}
Ceci est la méthode getUserPic
:
public void getUserPic(String userID){
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
new Task().execute(new String[] {imageURL});
}
Et voici le fil:
private class Task extends AsyncTask<String, Void, Bitmap>{
@Override
public Bitmap doInBackground(String...arg0){
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(arg0[0]);
try{
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
profilePicBitmap=BitmapFactory.decodeStream(content);
}
catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return profilePicBitmap;
}
@Override
public void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
arrayImageView.add(imageView);
}
}
Donc ce que je veux faire est quelque chose comme :
List<ImageView> arrayImageView=new ArrayList<ImageView>();
for(i....)
{
arrayImageView[i]=getUserPic(...);
}
public ImageView getUserPic(String userID){
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
new Task().execute(new String[] {imageURL});
return ImageView;
}
Je veux dire chaque ImageView
retourner par le thread AsyncTask à renvoyer aussi par la méthode getUserPic
.So serait plus facilement pour moi de garder une trace d'eux. Question: Comment procéder pour que l'image retournée par AsynTask
soit également la variable renvoyée par getUserPic()
.
J'espère u obtenir ce que je mean.Thx
la méthode 'onPostExecute' s'exécute sur l'interface principale (UI) fil. Vous devez probablement le synchroniser vous-même. – Mannaz
Je suis sûr que je dois faire cela.Mais je ne sais pas vraiment comment: P – adrian
J'irais avec '@Override public void onPostExecute (résultat Bitmap) { imageView.setImageBitmap (résultat); synchronized (arrayImageView) { arrayImageView.add (imageView);} } ' – Mannaz