You are on page 1of 9

AsysncTask

AsyncTask permite el uso adecuado y fácil del subproceso de interfaz de usuario. Esta clase
le permite realizar operaciones en segundo plano y publicar resultados en el subproceso de
interfaz de usuario sin tener que manipular subprocesos y / o controladores.

AsyncTask está diseñado para ser una clase auxiliar alrededor de Thread and Handler y no
constituye un marco de threading genérico. AsyncTasks debería usarse idealmente para
operaciones cortas (unos pocos segundos como máximo). Si necesita mantener los hilos
en ejecución durante largos periodos de tiempo, se recomienda encarecidamente que utilice
las diversas API proporcionadas por el paquete java.util.concurrent como Executor ,
ThreadPoolExecutor y FutureTask .

Una tarea asíncrona 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 está definida por 3 tipos genéricos, llamados Params , Progress y Result
, y 4 pasos, llamados onPreExecute , doInBackground , onProgressUpdate y
onPostExecute .

Guías del desarrollador


Para obtener más información sobre el uso de tareas y subprocesos, lea la guía para
desarrolladores de Procesos e hilos .

Uso
AsyncTask debe ser subclasificado para ser utilizado. La subclase anulará al menos un
método ( doInBackground(Params...) ( doInBackground(Params...) ), y la mayoría de las
veces anulará una segunda ( onPostExecute(Result) .

Aquí hay un ejemplo de subclassing:

clase privada DownloadFilesTask extends AsyncTask <URL, Integer, Long> {


protegido 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));
// Escape temprano si se llama cancel ()
if (isCancelled ()) break;
}
devolver totalSize;
}

nulo protegido onProgressUpdate (Entero ... progreso) {


setProgressPercent (progreso [0]);
}

vacío protegido onPostExecute (resultado largo) {


showDialog ("Descargado" + resultado + "bytes");
}
}
Una vez creada, una tarea se ejecuta de manera muy simple:

nuevo DownloadFilesTask (). execute (url1, url2, url3);

Tipos genéricos de AsyncTask


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

1. Params , el tipo de parámetros enviados a la tarea en la ejecución.


2. Progress , el tipo de unidades de progreso publicadas durante el cálculo de fondo.
3. Result , el tipo del resultado del cálculo de fondo.
No todos los tipos son siempre utilizados por una tarea asincrónica. Para marcar un tipo
como no utilizado, simplemente use el tipo Void :

clase privada MyTask extiende AsyncTask <Void, Void, Void> {...}

Los 4 pasos
Cuando se ejecuta una tarea asíncrona, la tarea pasa por 4 pasos:

1. onPreExecute() , invocado en el subproceso de la interfaz de usuario antes de que


se ejecute la tarea. Este paso se usa normalmente para configurar la tarea, por
ejemplo, al mostrar una barra de progreso en la interfaz de usuario.
2. doInBackground(Params...) , invocado en el hilo de fondo inmediatamente después
de onPreExecute() termina de ejecutarse. Este paso se usa para realizar un cálculo
de fondo que puede llevar mucho tiempo. Los parámetros de la tarea asíncrona se
pasan a este paso. El resultado del cálculo debe ser devuelto por este paso y será
devuelto al último paso. Este paso también puede usar publishProgress(Progress...)
para publicar una o más unidades de progreso. Estos valores se publican en el
subproceso UI, en el paso onProgressUpdate(Progress...) .
3. onProgressUpdate(Progress...) , invocado en el hilo de UI después de una llamada
a publishProgress(Progress...) . El momento de la ejecución no está definido. Este
método se usa para mostrar cualquier forma de progreso en la interfaz de usuario
mientras el cálculo de fondo aún se está ejecutando. Por ejemplo, se puede usar
para animar una barra de progreso o mostrar registros en un campo de texto.
4. onPostExecute(Result) , invocado en el hilo de la interfaz de usuario una vez que
finaliza el cálculo de fondo. El resultado del cálculo de fondo se pasa a este paso
como un parámetro.

Cancelando una tarea


Una tarea puede cancelarse en cualquier momento invocando cancel(boolean) . La
invocación de este método provocará que las llamadas posteriores a isCancelled()
devuelvan verdadero. Después de invocar este método, onCancelled(Object) , en lugar de
onPostExecute(Object) se invocará después de que doInBackground(Object[]) regrese.
Para garantizar que una tarea se cancele lo más rápido posible, siempre debe verificar el
valor de retorno de isCancelled() periódicamente desde doInBackground(Object[]) , si es
posible (dentro de un bucle, por ejemplo).

Enhebrar las reglas


Hay algunas reglas de enhebrado que se deben seguir para que esta clase funcione
correctamente:
 La clase AsyncTask debe cargarse en el subproceso UI. Esto se hace
automáticamente a partir de JELLY_BEAN .
 La instancia de la tarea debe crearse en el hilo de la interfaz de usuario.
 execute(Params...) debe invocarse en el subproceso UI.
 No onPreExecute() , onPostExecute(Result) , doInBackground(Params...) ,
onProgressUpdate(Progress...) manualmente.
 La tarea se puede ejecutar solo una vez (se lanzará una excepción si se intenta una
segunda ejecución).

Observabilidad de la memoria
AsyncTask garantiza que todas las llamadas de devolución de llamada estén sincronizadas
de tal forma que las siguientes operaciones sean seguras sin sincronizaciones explícitas.

 Establezca campos de miembros en el constructor o onPreExecute() , y refiérase a


ellos en doInBackground(Params...) .
 Establezca los campos de miembros en doInBackground(Params...) , y
onProgressUpdate(Progress...) referencia a ellos en onProgressUpdate(Progress...)
y onPostExecute(Result) .

Orden de ejecución
Cuando se introdujo por primera vez, las AsyncTasks se ejecutaron en serie en una única
cadena de fondo. Comenzando con DONUT , esto se cambió a un conjunto de subprocesos
que permite que varias tareas funcionen en paralelo. Comenzando con HONEYCOMB , las
tareas se ejecutan en un único hilo para evitar errores de aplicación comunes causados por
la ejecución paralela.

Si realmente desea la ejecución en paralelo, puede invocar


executeOnExecutor(java.util.concurrent.Executor, Object[]) con
THREAD_POOL_EXECUTOR .

Resumen
Clases anidadas
enum AsyncTask.Status
Indica el estado actual de la tarea.
Campos
public static final Executor SERIAL_EXECUTOR
Un Executor que ejecuta las tareas de a una por orden serial.
public static final Executor THREAD_POOL_EXECUTOR
Un Executor que se puede usar para ejecutar tareas en paralelo.
Constructores públicos
AsyncTask ()
Crea una nueva tarea asincrónica.
Métodos públicos
final boolean cancel (boolean mayInterruptIfRunning)
Intenta cancelar la ejecución de esta tarea.
final AsyncTask <Params, Progress, Result> execute (Params... params)
Ejecuta la tarea con los parámetros especificados.
static void execute ( Runnable runnable)
Versión de conveniencia de execute(Object) para usar con un objeto Runnable simple.
final AsyncTask <Params, Progress, Result> executeOnExecutor ( Executor exec,
Params... params)
Ejecuta la tarea con los parámetros especificados.
final Result get (long timeout, TimeUnit unit)
Espera, si es necesario, a lo sumo el tiempo dado para que se complete el cálculo, y luego
recupera su resultado.
final Result get ()
Espera si es necesario para que se complete el cálculo, y luego recupera su resultado.
final AsyncTask.Status getStatus ()
Devuelve el estado actual de esta tarea.
final boolean isCancelled ()
Devuelve verdadero si esta tarea se canceló antes de que se completara normalmente.
Métodos protegidos
abstract Result doInBackground (Params... params)
Reemplace este método para realizar un cálculo en una cadena de fondo.
void onCancelled ()
Las aplicaciones deben sobrescribir preferiblemente en onCancelled(Object) .
void onCancelled (Result result)
Se ejecuta en el subproceso de UI después de que se invoca cancel(boolean) y
doInBackground(Object[]) finaliza.
void onPostExecute (Result result)
Se ejecuta en el subproceso de interfaz de usuario después de doInBackground(Params...)
.
void onPreExecute ()
Se ejecuta en el subproceso de interfaz de usuario antes de doInBackground(Params...) .
void onProgressUpdate (Progress... values)
Se ejecuta en el subproceso de UI después de que se publishProgress(Progress...) .
final void publishProgress (Progress... values)
Este método se puede invocar desde doInBackground(Params...) para publicar
actualizaciones en el subproceso de UI mientras el cómputo en segundo plano aún se está
ejecutando.
Métodos heredados
Campos

SERIAL_EXECUTOR

agregado en el nivel de API 11


Ejecutor SERIAL_EXECUTOR
Un Executor que ejecuta las tareas de a una por orden serial. Esta serialización es global
para un proceso particular.

THREAD_POOL_EXECUTOR

agregado en el nivel de API 11


Ejecutor THREAD_POOL_EXECUTOR
Un Executor que se puede usar para ejecutar tareas en paralelo.

Constructores públicos
AsyncTask

agregado en el nivel 3 de la API


AsyncTask ()
Crea una nueva tarea asincrónica. Este constructor debe invocarse en el hilo de UI.
Métodos públicos
cancelar

agregado en el nivel 3 de la API


boolean cancel (boolean mayInterruptIfRunning)
Intenta cancelar la ejecución de esta tarea. Este intento fallará si la tarea ya se ha
completado, ya se ha cancelado o no se puede cancelar por algún otro motivo. Si tiene
éxito, y esta tarea no ha comenzado cuando se invoca cancelar , esta tarea nunca debería
ejecutarse. Si la tarea ya ha comenzado, el parámetro mayInterruptIfRunning determina si
el hilo que ejecuta esta tarea debe interrumpirse para intentar detener la tarea.

Llamar a este método dará como resultado que se onCancelled(Object) en el hilo de la


interfaz de usuario después de que doInBackground(Object[]) regrese. Llamar a este
método garantiza que onPostExecute(Object) nunca se invoque. Después de invocar este
método, debe verificar el valor devuelto por isCancelled() periódicamente desde
doInBackground(Object[]) para finalizar la tarea lo antes posible.

Parámetros
mayInterruptIfRunning boolean : true si el hilo que ejecuta esta tarea debe ser
interrumpido; de lo contrario, las tareas en progreso pueden completarse.
Devoluciones
boolean falso si la tarea no pudo ser cancelada, normalmente porque ya se ha
completado normalmente; cierto de lo contrario

ejecutar

AsyncTask < Params , Progress, Result> execute (Params ... params)


Ejecuta la tarea con los parámetros especificados. La tarea se devuelve (esto) para que la
persona que llama pueda mantener una referencia a ella.

Nota: esta función programa la tarea en una cola para una única cadena de subprocesos o
un grupo de subprocesos dependiendo de la versión de la plataforma. Cuando se introdujo
por primera vez, las AsyncTasks se ejecutaron en serie en una única cadena de fondo.
Comenzando con DONUT , esto se cambió a un conjunto de subprocesos que permite que
varias tareas funcionen en paralelo. Al iniciar HONEYCOMB , las tareas vuelven a
ejecutarse en un solo subproceso para evitar los errores de aplicación comunes causados
por la ejecución paralela. Si realmente desea la ejecución en paralelo, puede usar la
executeOnExecutor(Executor, Params...) de este método con
THREAD_POOL_EXECUTOR ; sin embargo, consulte los comentarios sobre advertencias
sobre su uso.

Este método debe invocarse en el hilo de la interfaz de usuario.

Este método debe invocarse desde el hilo principal de tu aplicación.

Parámetros
params Params : los parámetros de la tarea.
Devoluciones
AsyncTask <Params, Progress, Result> Esta instancia de AsyncTask.
Lanzamientos
IllegalStateException Si getStatus() devuelve RUNNING o FINISHED .

ejecutar

agregado en el nivel de API 11


void execute ( Runnable runnable )
Versión de conveniencia de execute(Object) para usar con un objeto Runnable simple.
Consulte execute(Object[]) para obtener más información sobre el orden de ejecución.

Este método debe invocarse desde el hilo principal de tu aplicación.

Parámetros
runnable Runnable

executeOnExecutor

AsyncTask < Params , Progress, Result> executeOnExecutor ( Executor exec,


Params ... params)
Ejecuta la tarea con los parámetros especificados. La tarea se devuelve (esto) para que la
persona que llama pueda mantener una referencia a ella.

Este método se usa normalmente con THREAD_POOL_EXECUTOR para permitir que se


ejecuten varias tareas en paralelo en un grupo de subprocesos administrados por
AsyncTask, sin embargo, también puede usar su propio Executor para el comportamiento
personalizado.

Advertencia: Permitir que varias tareas se ejecuten en paralelo desde un grupo de


subprocesos generalmente no es lo que uno quiere, porque el orden de su operación no
está definido. Por ejemplo, si estas tareas se utilizan para modificar cualquier estado en
común (como escribir un archivo debido a un clic de botón), no hay garantías sobre el orden
de las modificaciones. Sin un trabajo cuidadoso es posible en casos excepcionales que la
versión más nueva de los datos sea sobrescrita por una versión anterior, lo que lleva a
problemas de pérdida de datos y estabilidad poco claros. Tales cambios se ejecutan mejor
en serie; para garantizar que ese trabajo se serialice independientemente de la versión de
la plataforma, puede usar esta función con SERIAL_EXECUTOR .

Este método debe invocarse en el hilo de la interfaz de usuario.

Este método debe invocarse desde el hilo principal de tu aplicación.

Parámetros
exec Executor : el ejecutor a usar. THREAD_POOL_EXECUTOR está disponible como
un conveniente grupo de subprocesos para todo el proceso para tareas que están
débilmente acopladas.
params Params : los parámetros de la tarea.
Devoluciones
AsyncTask <Params, Progress, Result> Esta instancia de AsyncTask.
Lanzamientos
IllegalStateException Si getStatus() devuelve RUNNING o FINISHED .
obtener

agregado en el nivel 3 de la API


Resultado get (tiempo de espera largo,
Unidad TimeUnit )
Espera, si es necesario, a lo sumo el tiempo dado para que se complete el cálculo, y luego
recupera su resultado.

Parámetros
timeout long : tiempo de espera antes de cancelar la operación.
unit TimeUnit : la unidad de tiempo para el tiempo de espera.
Devoluciones
Result El resultado calculado.
Lanzamientos
CancellationException Si el cálculo fue cancelado.
ExecutionException Si el cálculo arrojó una excepción.
InterruptedException Si el hilo actual fue interrumpido mientras esperaba.
TimeoutException Si se agotó el tiempo de espera agotado.
obtener

Resultado get ()
Espera si es necesario para que se complete el cálculo, y luego recupera su resultado.

Devoluciones
Result El resultado calculado.
Lanzamientos
CancellationException Si el cálculo fue cancelado.
ExecutionException Si el cálculo arrojó una excepción.
InterruptedException Si el hilo actual fue interrumpido mientras esperaba.
obtener el estado

AsyncTask.Status getStatus ()
Devuelve el estado actual de esta tarea.

Devoluciones
AsyncTask.Status El estado actual.
está cancelado

boolean isCancelled ()
Devuelve verdadero si esta tarea se canceló antes de que se completara normalmente. Si
llama a cancel(boolean) en la tarea, el valor devuelto por este método debe verificarse
periódicamente desde doInBackground(Object[]) para finalizar la tarea lo antes posible.

Devoluciones
boolean true si la tarea se canceló antes de completarse

Métodos protegidos
doInBackground
Resultado doInBackground (Params ... params)
Reemplace este método para realizar un cálculo en una cadena de fondo. Los parámetros
especificados son los parámetros pasados para execute(Params...) por la persona que
llama de esta tarea. Este método puede llamar a publishProgress(Progress...) para publicar
actualizaciones en el hilo de UI.

Este método puede tardar varios segundos en completarse, por lo que solo debe invocarse
desde un hilo de trabajo.

Parámetros
params Params : los parámetros de la tarea.
Devoluciones
Result Un resultado, definido por la subclase de esta tarea.

onCancelled
void onCancelled ()
Las aplicaciones deben sobrescribir preferiblemente en onCancelled(Object) . Este método
es invocado por la implementación predeterminada de onCancelled(Object) .

Se ejecuta en el subproceso de UI después de que se invoca cancel(boolean) y


doInBackground(Object[]) finaliza.

Este método debe invocarse desde el hilo principal de tu aplicación.

onCancelled
void onCancelled (resultado del resultado)
Se ejecuta en el subproceso de UI después de que se invoca cancel(boolean) y
doInBackground(Object[]) finaliza.

La implementación predeterminada simplemente invoca a onCancelled() e ignora el


resultado. Si escribe su propia implementación, no llame a super.onCancelled(result) .

Este método debe invocarse desde el hilo principal de tu aplicación.

Parámetros
result Result : el resultado, si lo hay, calculado en doInBackground(Object[]) , puede ser
nulo

onPostExecute
void onPostExecute (resultado del resultado)
Se ejecuta en el subproceso de interfaz de usuario después de doInBackground(Params...)
. El resultado especificado es el valor devuelto por doInBackground(Params...) .

Este método no se invocará si la tarea se canceló.

Este método debe invocarse desde el hilo principal de tu aplicación.

Parámetros
result Result : el resultado de la operación calculada por doInBackground(Params...) .
onPreExecute
void onPreExecute ()
Se ejecuta en el subproceso de interfaz de usuario antes de doInBackground(Params...) .

Este método debe invocarse desde el hilo principal de tu aplicación.


onProgressUpdate
void onProgressUpdate (Progreso ... valores)
Se ejecuta en el subproceso de UI después de que se publishProgress(Progress...) . Los
valores especificados son los valores pasados a publishProgress(Progress...) .

Este método debe invocarse desde el hilo principal de tu aplicación.

Parámetros
values Progress : los valores que indican el progreso.

publicarProgreso
void publishProgress (Progreso ... valores)
Este método se puede invocar desde doInBackground(Params...) para publicar
actualizaciones en el subproceso de UI mientras el cómputo en segundo plano aún se está
ejecutando. Cada llamada a este método activará la ejecución de
onProgressUpdate(Progress...) en el hilo de la interfaz de usuario.
onProgressUpdate(Progress...) no se onProgressUpdate(Progress...) si la tarea se ha
cancelado.

Este método puede tardar varios segundos en completarse, por lo que solo debe invocarse
desde un hilo de trabajo.

Parámetros
values Progress : los valores de progreso para actualizar la UI con.

You might also like