¿Qué argumentos se pasan a AsyncTask <arg1, arg2, arg3>?

157

No entiendo lo que se supone que debo poner aquí y dónde terminan estos argumentos. ¿Qué debo poner exactamente y adónde irá exactamente? ¿Debo incluir los 3 o puedo incluir 1,2,20?

Mergesort
fuente

Respuestas:

496

La documentación de Android de Google dice que:

Una tarea asincrónica se define mediante 3 tipos genéricos, llamados Parámetros, Progreso y Resultado, y 4 pasos, llamados onPreExecute, doInBackground, onProgressUpdate y onPostExecute.

Tipos genéricos de AsyncTask:

Los tres tipos utilizados por una tarea asincrónica son los siguientes:

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

No todos los tipos son utilizados siempre por una tarea asincrónica. Para marcar un tipo como no utilizado, simplemente use el tipo Void:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

También puede consultar: http://developer.android.com/reference/android/os/AsyncTask.html

O puede aclarar cuál es el papel de AsyncTask consultando el blog de Sankar-Ganesh

Bueno, la estructura de una clase AsyncTask típica es la siguiente:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

Este método se ejecuta antes de comenzar el nuevo hilo. No hay valores de entrada / salida, así que simplemente inicialice las variables o lo que crea que necesita hacer.

    protected Z doInBackground(X...x){

    }

El método más importante en la clase AsyncTask. Tienes que colocar aquí todas las cosas que quieres hacer en segundo plano, en un hilo diferente del principal. Aquí tenemos como valor de entrada una matriz de objetos del tipo "X" (¿Ves en el encabezado? Tenemos "... extiende AsyncTask" Estos son los TIPOS de los parámetros de entrada) y devuelve un objeto del tipo "Z".

   protected void onProgressUpdate(Y y){

   }

Se llama a este método usando el método PubliqueProgreso (y) y generalmente se usa cuando desea mostrar cualquier progreso o información en la pantalla principal, como una barra de progreso que muestra el progreso de la operación que está realizando en segundo plano.

  protected void onPostExecute(Z z){

  }

Este método se llama después de que se realiza la operación en segundo plano. Como parámetro de entrada, recibirá el parámetro de salida del método doInBackground.

¿Qué pasa con los tipos X, Y y Z?

Como puede deducir de la estructura anterior:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

¿Cómo llamamos a esta tarea desde una clase externa? Solo con las siguientes dos líneas:

MyTask myTask = new MyTask();

myTask.execute(x);

Donde x es el parámetro de entrada del tipo X.

Una vez que tenemos nuestra tarea en ejecución, podemos averiguar su estado desde "afuera". Usando el método "getStatus ()".

 myTask.getStatus();

y podemos recibir el siguiente estado:

EN EJECUCIÓN : indica que la tarea se está ejecutando.

PENDIENTE : indica que la tarea aún no se ha ejecutado.

FINALIZADO : indica que onPostExecute (Z) ha finalizado.

Consejos sobre el uso de AsyncTask

  1. No llame a los métodos onPreExecute, doInBackground y onPostExecute manualmente. Esto lo hace automáticamente el sistema.

  2. No puede llamar a una AsyncTask dentro de otra AsyncTask o Thread. La llamada del método execute debe hacerse en el subproceso de la interfaz de usuario.

  3. El método onPostExecute se ejecuta en el subproceso de la interfaz de usuario (¡aquí puede llamar a otra AsyncTask!).

  4. Los parámetros de entrada de la tarea pueden ser una matriz de objetos, de esta manera puede colocar los objetos y tipos que desee.

Kartik Domadiya
fuente
20
Explicación perfecta amigo
Kalai.G
30
Mejor que Google
Diolor
25
+1. So miembros, tomen nota. Así es como lo explicas. Aunque es largo, es extremadamente fácil de entender. Gracias Kartik
Subby
3
Buena explicación, ahora tengo muy claro sobre Asyntask. :) Gracias Kartik
Reena
2
Eso me aclaró muchas cosas, ¡gran respuesta!
Michael
80

Llegué demasiado tarde a la fiesta, pero pensé que esto podría ayudar a alguien.

Mrid
fuente
77
Este visual fue extremadamente útil. Voy a comenzar a usar más elementos visuales como este para mostrar cómo los Tipos y sus variables relacionadas están vinculados cuando el flujo de código no es sencillo o la técnica o patrón es poco común. Espero que otros hagan más de esto. Gracias
Kent Lauridsen
Buenas imágenes, ¿puedes agregar también para WeakAsyncTask?
kAmol
1
@kAmol seguro, intentaré hacer un flujo WeakAsyncTasktambién
mrid
44
Un día enmarcaré esto y lo pondré en mi pared para que no tenga que volver a este hilo como referencia.
Matt Robertson el
14

¡Mantenlo simple!

Una AsyncTaskes una tarea en segundo plano que se ejecuta en el subproceso en segundo plano. Toma una entrada , realiza el progreso y da salida .

es decir AsyncTask<Input,Progress,Output>.

En mi opinión, la principal fuente de confusión surge cuando intentamos memorizar los parámetros en el AsyncTask.
La clave es no memorizar .
Si puede visualizar lo que su tarea realmente necesita hacer, entonces escribir AsyncTaskcon la firma correcta sería pan comido.
Solo averigüe cuáles son sus entradas , progreso y salida y estará listo para comenzar.

Por ejemplo: ingrese la descripción de la imagen aquí

Heart of the AsyncTask!

doInBackgound()El método es el método más importante en un AsyncTaskporque

  • Solo este método se ejecuta en el subproceso en segundo plano y publica datos en el subproceso de la interfaz de usuario.
  • Su firma cambia con los AsyncTaskparámetros.

Así que veamos la relación

ingrese la descripción de la imagen aquí

doInBackground()y onPostExecute(), onProgressUpdate()también están relacionados

ingrese la descripción de la imagen aquí

Muéstrame el código
Entonces , ¿cómo escribiré el código para DownloadTask?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

¿Cómo ejecutarás esta tarea?

new DownLoadTask().execute("Paradise.mp3");
Rohit Singh
fuente
1
// show in spinner, access UI elementsfue simplemente la explicación más directa para el onProgressUpdate(...):)
Volkan Güven
5

Consulte los siguientes enlaces:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

No puede pasar más de tres argumentos, si desea pasar solo 1 argumento, use void para los otros dos argumentos.

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

Una tarea asincrónica se define mediante un cálculo que se ejecuta en un subproceso en segundo plano y cuyo resultado se publica en el subproceso de la interfaz de usuario. Una tarea asincrónica se define mediante 3 tipos genéricos, llamados Parámetros, Progreso y Resultado, y 4 pasos, llamados onPreExecute, doInBackground, onProgressUpdate y onPostExecute.

KPBird

Ketan Parmar
fuente
3
  • En resumen, hay 3 parámetros en AsyncTask

    1. parámetros para el uso de entrada en DoInBackground (String ... params)

    2. parámetros para mostrar el estado del uso del progreso en OnProgressUpdate (String ... status)

    3. parámetros para el uso de resultados en OnPostExcute (String ... result)

    Nota: - [El tipo de parámetros puede variar según sus requisitos]

Chinki Sai
fuente