AsyncTask: ¿dónde va el valor de retorno de doInBackground ()?

Al llamar a AsyncTask<Integer,Integer,Boolean> , donde es el valor devuelto de:

protected Boolean doInBackground(Integer... params) ?

Usualmente iniciamos AsyncTask con new AsyncTaskClassName().execute(param1,param2......); Pero no parece devolver un valor.

¿Dónde se puede encontrar el valor de retorno de doInBackground() ?

El valor está entonces disponible en onPostExecute, que es posible que desee anular para trabajar con el resultado.

Aquí hay un fragmento de código de ejemplo de los documentos 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"); } } 

Puede recuperar el valor devuelto de Boolean doInBackground() al llamar al método get () de la clase AsyncTask :

 AsyncTaskClassName task = new AsyncTaskClassName(); bool result = task.execute(param1,param2......).get(); 

Pero tenga cuidado con la capacidad de respuesta de la interfaz de usuario, porque get() espera que el cálculo se complete y bloqueará el subproceso de la interfaz de usuario .
Si está utilizando una clase interna, es mejor hacer el trabajo en el método onPostExecute (Boolean result).

Si solo desea actualizar la interfaz de usuario, AsyncTask ofrece dos posibilidades:

  • Para actualizar la interfaz de usuario en paralelo con la tarea ejecutada en doInBackground() (por ejemplo, para actualizar un ProgressBar ), tendrá que llamar a publishProgress() dentro del método doInBackground() . A continuación, debe actualizar la interfaz de usuario en el método onProgressUpdate() .
  • Para actualizar la interfaz de usuario cuando se realiza la tarea, debe hacerlo en el método 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 esta manera usted no tiene que preocuparse por problemas de respuesta.

  • Async tarea para mostrar un AlertDialog
  • Cuál es mejor: Loader o Fragmentos sin cabeza
  • Cómo gestionar diferentes tareas que deben ser llamadas por AsyncTask
  • ¿Debo dar params al constructor oa AsyncTask.execute (params)?
  • Cómo pasar valores a AsyncTask Android
  • Entidad devuelve error en MultiPartEntityBuilder
  • Android reiniciar AsyncTask
  • Android AsyncTask en clase externa
  • Barra de progreso de la actualización en listview para archivos múltiples descarga
  • Android: ¿Alternativas a AsyncTask?
  • Volátil y sinchonizado en AsyncTask
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.