Une simple question : est-il possible de renvoyer une valeur en AsyncTask
?
//AsyncTask is a member class
private class MyTask extends AsyncTask<Void, Void, Void>{
protected Void doInBackground(Void... params) {
//do stuff
return null;
}
@Override
protected void onPostExecute(Void result) {
//do stuff
//how to return a value to the calling method?
}
}
Et puis dans mon Activity
/ Fragment
:
// The task is started from activity
myTask.execute()
// something like this?
myvalue = myTask.getvalue()
EDIT : Cette question a été posée il y a longtemps et je n'étais pas familier avec Java. Maintenant que je m'y connais mieux, je vais faire un résumé rapide :
L'intérêt d'une tâche asynchrone est que la tâche est asynchronous
ce qui signifie qu'après avoir appelé execute()
sur la tâche, la tâche commence à s'exécuter sur un thread qui lui est propre. renvoyer une valeur de asynctask serait inutile parce que le thread appelant original a déjà continué à faire d'autres choses (donc la tâche est asynchrone).
Pensez au temps : À un moment donné, vous avez lancé une tâche qui s'exécutera en parallèle avec le fil principal. Lorsque la tâche parallèle s'est terminée, le temps s'est également écoulé sur le fil principal. La tâche parallèle ne peut pas remonter le temps pour renvoyer une valeur au thread principal.
Je venais du C, donc je n'y connaissais pas grand-chose. Mais il semble que beaucoup de personnes se posent la même question, alors j'ai pensé que je pourrais clarifier un peu les choses.
3 votes
En ce qui concerne vos modifications, un ensemble étroitement lié d'objets basés sur les threads a le concept de retour de quelque chose : les threadpools et les futures. Lorsque vous soumettez une tâche à un pool de threads, vous obtenez un futur. À un moment donné (espérons-le après que le runnable ait terminé), vous demandez au future sa valeur de retour. Si le runnable est terminé, vous obtenez immédiatement la valeur de retour, sinon le thread attend qu'il soit terminé. J'utilise souvent cette méthode pour diviser quelque chose en plusieurs parties, les exécuter simultanément et obtenir les résultats (souvent quelques lignes plus tard).
0 votes
@RichardTingle pouvez-vous me fournir un lien sur ce dont vous parlez... un exemple de code serait préférable. Merci d'avance et n'oubliez pas de me mentionner dans vos commentaires.
0 votes
Puis-je obtenir un résultat avec quelque chose comme un écouteur ?
0 votes
Oui, mais faites attention à ne pas le faire fuir, utilisez un
WeakReference
ou quelque chose de similaire