2011-07-18 2 views
0

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

+0

la méthode 'onPostExecute' s'exécute sur l'interface principale (UI) fil. Vous devez probablement le synchroniser vous-même. – Mannaz

+0

Je suis sûr que je dois faire cela.Mais je ne sais pas vraiment comment: P – adrian

+0

J'irais avec '@Override public void onPostExecute (résultat Bitmap) { imageView.setImageBitmap (résultat); synchronized (arrayImageView) { arrayImageView.add (imageView);} } ' – Mannaz

Répondre

1

Si je ne me trompe pas, vous pouvez le faire ..

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}); 
progressDialog = ProgressDialog.show(context, "", "Please Wait....");//**progressDialog** an instance variable 

return ImageView; 

     } 

et postExecute rejeter cette boîte de dialogue .. Je suggère cela parce que, en ce moment le thread UI sera bloqué et vous pouvez vous assurer que votre imageView est initialisé avec une certaine valeur dans postExecute() et peut être retourné lorsque la boîte de dialogue est fermée et que le thread d'interface utilisateur reprend ..

Questions connexes