2011-07-17 4 views
0

J'ai une application dans android qui récupèrent une image de http page.Je demande cette image en utilisant un fil AsyncTask.erreur de thread AsyncTask

Voici comment je le fais:

mPostButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

        for(int i=0;i<friends.size();i++) 
        { 
      getUserPic(friends.get(i).getId()); 
        } 
       } 
      }); 

J'ai un ArrayList appelé friends et pour chaque élément de la liste que je vous appelle la méthode: getUserPic() qui exécute un fil AyncTask:

public void getUserPic(String userID){ 
     final String imageURL; 
     Bitmap bitmap=null; 
     imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small"; 
     task.execute(new String[] {imageURL}); 

    } 

Chaque fois que cela s'appelle getUserPic() utilise un thread AsyncTask pour appeler le imageURL.

Le problème est que je reçois FC .... voici comment mon logcat ressemble:

java.lang.IllegalStateException: Cannot execute task: the task is already running. 
    at android.os.AsyncTask.execute(AsyncTask.java:380) 
    at com.facebook.android.Example.getUserPic(Example.java:129) 
    at com.facebook.android.Example$3.onClick(Example.java:114) 
    at android.view.View.performClick(View.java:2364) 
    at android.view.View.onTouchEvent(View.java:4179) 
    at android.widget.TextView.onTouchEvent(TextView.java:6540) 
    at android.view.View.dispatchTouchEvent(View.java:3709) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 

Toute personne, toute solution à ce Thank u!

Répondre

2
public void getUserPic(String userID){ 
     final String imageURL; 
     Bitmap bitmap=null; 
     imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small"; 
     new task().execute(new String[] {imageURL}); 

    } 
2

Dans ce cas, l'erreur est assez auto-descriptive. La tâche est déjà en cours. Comme vous l'exécutez en boucle, vous devez initialiser une nouvelle tâche asynchrone pour chaque itération et la supprimer.

Ahh, les joies de code parallélisé :)

+0

Je sais que ... mais je ne sais pas comment y remédier !! Il n'y a pas de méthode de sommeil pour cela.Alors je demande une solution !!! – adrian

+0

Pourriez-vous poster un peu de code de la façon de le faire? Thx – adrian

5

Vous utilisez le même objet task pour chaque itération de la boucle (ce qui est la raison pour laquelle l'erreur indique « la tâche est en cours d'exécution »). Vous pouvez résoudre ce problème en créant un nouvel objet de tâche pour chaque itération, par ex. Cependant, cela pourrait être assez fastidieux si vous finissez par démarrer beaucoup de tâches. Donc, vous pouvez être mieux d'avoir une tâche et lui donner une liste d'images à télécharger. Par exemple.

ids = new ArrayList<String>(); 
for(int i=0;i<friends.size();i++) 
{ 
    ids.add(friends.get(i).getId()); 
} 
getUserPics(ids); 

Ensuite, votre méthode getUserPic passerait tous les ID à une seule instance de tâche.

public void getUserPics(List<String> userIDs){ 
    final String imageURL; 
    Bitmap bitmap=null; 

    String[] imageURLs = new String[userIDs.legnth()]; 
    for(int i = 0; i < userIDs.length(); i++) { 
    imageURLs[i] ="http://graph.facebook.com/"+userIDs[i]+"/picture?type=small"; 
    } 

    task.execute(imageURLs); 
} 

En procédant ainsi, vous aurez probablement envie d'utiliser publishProgress sur AsyncTask pour mettre à jour l'interface utilisateur avec les images que vous avez téléchargées jusqu'à présent, plutôt que d'attendre jusqu'à la fin quand vous avez tous.

+0

Est ok .... mais déjà accepté une réponse.Seuls Thumbs up pour vous :) – adrian

+1

c'est une bien meilleure réponse, vous pouvez toujours désélectionner l'autre réponse et marque celui-ci comme le bon :-) –