Lorsque vous appelez AsyncTask<Integer,Integer,Boolean>
, Où est la valeur de retour de:
protected Boolean doInBackground(Integer... params)
?
Habituellement, nous commençons AsyncTask avec new AsyncTaskClassName().execute(param1,param2......);
mais il ne semble pas renvoyer de valeur.
Où la valeur de retour de doInBackground()
peut-elle être trouvée?
La valeur est alors disponible dans onPostExecute que vous voudrez peut-être remplacer afin de travailler avec le résultat.
Voici un exemple d'extrait de code tiré de la documentation de Google:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Vous pouvez récupérer la valeur de retour de la valeur booléenne protégée doInBackground()
en appelant la méthode get () de AsyncTask
classe:
AsyncTaskClassName task = new AsyncTaskClassName();
bool result = task.execute(param1,param2......).get();
Mais faites attention à la réactivité de l'interface utilisateur, car get()
attend que le calcul soit terminé et bloquera le fil de l'interface utilisateur .
Si vous utilisez une classe interne, il est préférable de faire le travail dans la méthode onPostExecute (résultat booléen).
Si vous voulez juste mettre à jour l'interface utilisateur, AsyncTask
vous offre deux possibilités:
doInBackground()
(par exemple, pour mettre à jour un ProgressBar
), vous devez appeler publishProgress()
à l'intérieur de la fonction doInBackground()
méthode. Ensuite, vous devez mettre à jour l'interface utilisateur dans la méthode onProgressUpdate()
.onPostExecute()
. /** This method runs on a background thread (not on the UI thread) */
@Override
protected String doInBackground(String... params) {
for (int progressValue = 0; progressValue < 100; progressValue++) {
publishProgress(progressValue);
}
}
/** This method runs on the UI thread */
@Override
protected void onProgressUpdate(Integer... progressValue) {
// TODO Update your ProgressBar here
}
/**
* Called after doInBackground() method
* This method runs on the UI thread
*/
@Override
protected void onPostExecute(Boolean result) {
// TODO Update the UI thread with the final result
}
De cette façon, vous n'avez pas à vous soucier des problèmes de réactivité.