web-dev-qa-db-fra.com

AsyncTask: où va la valeur de retour de doInBackground ()?

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?

60
Dhruv Mevada

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");
      }
 }
61
Konstantin Burov

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:

  • Pour mettre à jour l'interface utilisateur en parallèle avec la tâche exécutée dans 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().
  • Pour mettre à jour l'interface utilisateur lorsque la tâche est terminée, vous devez le faire dans la méthode 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é.

  • 33
    Cyril Leroux