2012-09-17 5 views
0

J'essaie d'utiliser AsyncTask pour télécharger une chaîne et renvoyer la chaîne. Je veux utiliser AsyncTask car cela peut prendre un certain temps. Un problème est que je ne trouve nulle part sur Internet un exemple d'une asyncTask renvoyant un type quelconque de valeur. J'ai donc pris l'exemple dans le livre Commonsware et modifié pour retourner une valeur et je reçois la valeur comme suit:Obtention de résultats à partir d'un AsyncTask

String mystr = new AddStringTask().execute().get(); 

Bien que cela fonctionne, il semble que cette ligne de code est en attente de la valeur de retour et par conséquent synchrone. Il doit y avoir un moyen de déclencher un événement avec les résultats de la AddStringTask.

Comment cela est-il fait? Merci, Gary

+0

voir cette question: http://stackoverflow.com/questions/9447646/how-do-i-send-data-back-from-onpostexecute-in-an-asynctask/9447833#9447833 –

Répondre

2

Un AsyncTask ne peut pas renvoyer une valeur, car pour obtenir la valeur renvoyée, vous devez attendre avant que la tâche soit terminée. Cela rendrait le AsyncTask insignifiant. Au lieu de cela, vous devez déplacer votre code dans onPostExecute() (qui s'exécute sur le thread d'interface utilisateur, si cela vous inquiète). C'est ici que vous gérez la valeur renvoyée par doInBackground() et mettez généralement à jour l'interface utilisateur ou affichez un message d'erreur.

+0

Ok, je pense que je trouver. OnPostExecute est sur le thread UI et il est analogue à l'événement _completed dans le monde Microsoft WCF. –

+0

Une autre façon d'obtenir des résultats de votre AsyncTask dans votre activité. Je viens d'écrire sur mon blog et vous pouvez l'ajouter. vous pouvez vous référer au lien suivant: http://smartphonebysachin.blogspot.in/2012/11/how-to-return-value-from-async-task-in.html –

0

De même, si vous souhaitez implémenter une asyncTask plus générale, vous pouvez implémenter quelque chose comme ceci pour compartimenter votre code dans l'activité.

@Override 
protected void onPostExecute(Bitmap r){ 
    if (r != null) { 
     processListeners(r); 
    } 
} 

protected void processListeners(Object data) { 
    for (final AsyncTaskDone l : listeners) l.finished(data); 
} 

public void addAsyncTaskListener (final AsyncTaskDone l){ 
    listeners.add(l); 
} 

Où AsyncTaskListener est une interface avec une fonction appelée fini mis en œuvre dans l'activité de la même manière un onClickListener serait.

+0

Faites attention à cela, quand il s'agit de changer la configuration de une activité. Ceci est mieux utilisé à partir de quelque chose comme un fragment retenu. – CommonsWare

+0

Vrai - pour la rotation, la meilleure solution serait d'implémenter la classe Loader à la place –

+0

Je ne dirais pas cela, car le framework 'Loader' fonctionne vraiment bien pour' ContentProviders', et moins bien pour tout le reste. – CommonsWare

Questions connexes