Professional Documents
Culture Documents
AsyncTask en Android
En este artículo te mostraremos todos los secretos del AsyncTask de Android para programar con multitarea real. Antes de
empezar, comentar que aquí nos centraremos en la programación del AsyncTask desde cero, con un ejemplo real y funcional,
entendiendo bien cada parte del mismo, explicado de una manera muy fácil con la que creemos desde Jarroba resolverá todas tus
dudas para siempre (y sino pregúntanos, que estamos encantados de echarte una mano). Tanto si no AsyncTask , o ya has trabajado
con él y quieres profundizar; es muy recomendable que leas la primera parte de este artículo sobre la multitarea de Android aquí
(https://jarroba.com/multitarea-en-android/), que aunque sea teórico está bastante novelado y con bastantes imágenes para que sea
muy ameno y enriquecedor. Como siempre que estamos programando en Android, tengo que indicar que este tutorial asume que
entiendes lo mínimo de Android, como son las Activities y su ciclo de vida (repasa las Activityes aquí (https://jarroba.com/activity-
entender-y-usar-una-actividad/)). ¿Ya estamos listos? No hay tiempo para la pausa, pongámonos en marcha
Para programar la multitarea en Android, se puede usar la clase Thread de toda la vida de Java con los métodos synchronized
y ser nosotros quienes controlemos todo. Pero gracias a una clase especial llamada AsyncTask, nos facilitará mucho la vida y será
mucho más óptimo, será la que recomendamos. Esta clase actúa de editor y nosotros nos suscribiremos a esta al extender (heredar)
de ella. Al hacerlo nos pedirá que sobrescribamos e implementemos ciertos métodos que estarán vacíos.
Para entender cómo hacerlo, lo mejor es primero entender el ciclo de vida de la clase AsyncTask. Imaginemos una
aplicación como la del “Ejemplo de trabajar con el hilo principal solo para la interfaz gráfica y el resto en segundo plano” del artículo
anterior dedicado a la multitarea de Android (https://jarroba.com/multitarea-en-android/). Al pulsar el botón de descargar los datos
de Internet, crearíamos el hilo en segundo plano usando AsyncTask. Echa un vistazo rápido a la siguiente imagen y continúa leyendo
la explicación.
(https://jarroba.com/wp-content/uploads/2013/09/Ciclo-de-vida-del-Asynktask-de-Android-www.Jarroba.com_.png)
Al crearse el objeto de la clase AsyncTask se llama, para empezar, a su primer método onPreExecute() que se ejecuta sobre
el hilo principal. Al terminar este AsyncTask crea un hilo secundario y ejecuta su trabajo dentro de doInBackground(). Durante la
ejecución en segundo plano podemos realizar llamadas al hilos principal (por ejemplo, para incrementar la barra de carga a medida
que se ejecuta el hilo en segundo plano) desde doInBackground(), y con ayuda de publishProgress(), a un método sobrescrito
llamado onProgressUpdate(). No es obligatorio llamar a publishProgress(), pudiendo no llamarlo nunca con lo que nunca
Uso de cookies
entraremos en onProgressUpdate(), o llamándolo las veces que queramos. Al terminar de ejecutarse doInBackground() se llama de
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
inmediato a onPostExecute(), y se da por acabado a este hilo en segundo plano.
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 1/41
16-01-2019 AsyncTask en Android - Jarroba
Un inciso, ¿Te has fijado en la imagen como empieza el nombre de los métodos? ¿Cuáles con do y cuáles con on? Huele a
programación orientada a eventos.
Te puedes preguntar ¿para qué tantos métodos sobrescritos en el hilo principal? Pues cada uno tiene una función que
deberás encontrar tú mismo. De todas maneras ninguno del hilo principal es obligatorio implementarlo (Solo es obligatorio
implementar “doInBackground()”, que corre en segundo plano y sin el carece de sentido usar “AsyncTask”). Un ejemplo de uso de los
métodos sobrescritos en el hilo principal sería:
1. onPreExecute: abrir una ventana emergente con la barra de carga vacía que le indica al usuario que espere un momento.
2. onProgressUpdate: repetir 100 veces para ir dibujando la carga de la barra de la ventana desde 0 a 100.
3. onPostExecute: cerrar la ventana emergente.
¿Tenemos que ejecutar el doInBackground() hasta el final siempre? No necesariamente. Podemos cancelar la tarea en
segundo plano cuando lo necesitemos, con la llamada al método cancel() (se podría invocar, por ejemplo, en el catch de un try
porque algo ha ido mal). Lo único que seremos nosotros quienes decidamos detener la ejecución de doInBackground(). Y si, por
ejemplo, dentro de ésta existe un while, tendremos que preguntar en cada iteración si está cancelada con isCancelled(). Al terminar
de ejecutar el contenido doInBackground() ya no se ejecutará el método sobrescrito onPostExecute() sino onCancelled().
(https://jarroba.com/wp-content/uploads/2013/09/Ciclo-de-vida-del-Asynktask-cancelado-de-Android-www.Jarroba.com_.png)
Indicar, que onCancelled() solo funciona bien a partir de Android 3.0 en adelante (en versiones anteriores no entra en este
método). Es importante conocerlo y saber manejarlo, pues es una buena práctica para el tratamiento de errores y de diferenciar
estados de la aplicación (sobre todo para avisar al usuario con una ventana emergente de que se ha cancelado el proceso, por
ejemplo).
Lee la siguiente nota, pero no te entretengas mucho en ella, pues todo se esclarecerá al ver un ejemplo funcionar un poco
más adelante. De momento fíjate solo en los métodos sobrescritos (los que tienen encima un @Override), para que los compares
con las imágenes anteriores. Y que te fijes en que extiende la clase de AsyncTask. Ojo, si ves símbolos o cosas extrañas que no
entiendes, tranquilo, con calma y sigue leyendo, que los explicamos unas líneas más abajo.
Nota: a continuación el snippet de código de cómo crear un AsyncTask, y la primera línea con la creación del objeto para que
se ponga en marcha el hilo en segundo plano. Este código no hace nada; es decir, sí compila y ejecuta, pero es una plantilla vacía
para que en un futuro la copies y pegues. En cuanto entiendas AsynkTask vas a ser todo un lince, programando hilos a toda
velocidad y bien; más todavía con este snippet para crear un AsyncTask de Android (cortesía de Jarroba ).
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 2/41
16-01-2019 AsyncTask en Android - Jarroba
public HiloEnSegundoPlano(){
//TODO código del constructor
}
@Override
protected void onPreExecute() {
//TODO código del onPreExecute (Hilo Principal)
}
@Override
protected Tipo_terminarBackground doInBackground(Tipo_empezarBackground... varEntrarBackground) {
//TODO código del doInBackground (Hilo en Segundo Plano)
//...
publishProgress(valor_Tipo_duranteBackground); //Opcional. Para pasar el valor y llamar a onPro
gressUpdate()
//...
//...
cancel(true); //Opcional. Para cancelar en vez de ejecutar al terminar onPostExecute(), ejecuta
r onCancelled(). Comprobar si se ha cancelado con isCancelled()
//...
return valor_Tipo_terminarBackground;
}
@Override
protected void onProgressUpdate(Tipo_duranteBackground... varDuranteBackground) {
//TODO código del onProgressUpdate (Hilo Principal)
}
@Override
protected void onPostExecute(Tipo_terminarBackground varTerminarBackground) {
//TODO código del onPostExecute (Hilo Principal)
}
@Override
protected void onCancelled (Tipo_terminarBackground varTerminarBackground) {
//TODO código del onCancelled (Hilo Principal)
}
Del anterior código, el único método obligatorio es el doInBackground(), el resto los puedes eliminar si no los vas a usar. Por
si no tienes suficiente con este tutorial, tienes toda la información oficial del AsyncTask en:
http://developer.android.com/reference/android/os/AsyncTask.html
(http://developer.android.com/reference/android/os/AsyncTask.html)
Y por fin, lo que todo el mundo estaba esperando: el reluciente código funcional de una aplicación de ejemplo completa. Con
barra de progreso determinada, hasta cómo se maneja cuando se cancela el doInBackground().
Vamos a suponer que queremos descargar unas imágenes de Internet (estas no las descargaremos realmente, sino que
simularemos la descarga pausando un poco el hilo secundario), a la vez que el usuario pueda hacer otra cosa, como pulsar un botón
y que un mensaje aparezca (esto sin hilos sería imposible, como habrás deducido por las pistas del anterior artículo
(https://jarroba.com/multitarea-en-android/)).
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 3/41
16-01-2019 AsyncTask en Android - Jarroba
(https://jarroba.com/wp-content/uploads/2013/09/Ejemplo-de-aplicacion-con-AsynkTask-de-Android-www.Jarroba.com_.png)
Inmediatamente al terminar la descarga haremos que el texto se pondrá verde. Aparte de cambiar lo que nos cuenta, que si
te fijas pone "Hilo PRINCIPAL" todo el rato y esto es porque el texto cambia solo en el hilo principal.
(https://jarroba.com/wp-content/uploads/2013/09/Ejemplo-de-carga-terminada-correctamente-con-AsynkTask-de-Android-
www.Jarroba.com_.png)
Al igual que queremos que, si se cumple cierta condición (si ponemos true a una variable que se cancele al pasar de 100
imágenes descargadas), la descarga se interrumpa inmediatamente y el texto aparecerá en rojo.
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 4/41
16-01-2019 AsyncTask en Android - Jarroba
(https://jarroba.com/wp-content/uploads/2013/09/Ejemplo-de-carga-cancelada-con-AsynkTask-de-Android-www.Jarroba.com_.png)
El código XML del activity_main.xml no tiene más misterio: una barra de progreso, un texto y un botón.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ProgressBar
android:id="@+id/progressBar_indicador"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp" />
<TextView
android:id="@+id/TextView_mensajesAlUsuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button_probarComoPodemosHacerOtraCosa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="Mientras carga la barra haz click aquí, para probar como podemos hacer varias cosas a la vez sin
interrumpir al usuario" />
</LinearLayout>
Para el resto trabajaremos únicamente sobre MainActivity.java. Crearemos una clase que extienda de Activity. La cual
empezará con tres variables globales.
La que se encargará de decir si cancelamos o no la descarga al pasa de 100 imágenes. Lo pondremos a “true” si queremos ver
cómo funciona al cancelarse el doInBackground(). Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 5/41
16-01-2019 AsyncTask en Android - Jarroba
El tag del log para que veamos por consola lo que va haciendo nuestra aplicación.
Crearemos el onCreate del Activity en el que asociaremos el TextView. Le pondremos funcionalidad al botón para que
muestre el Toast. Y crearemos y ejecutaremos nuestro AsyncTask al final, al que le meteremos al constructor si queremos que se
cancele.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Los que me hayan leído otros tutoriales, sabrán que me gusta poner el código lo más compacto y claro posible. La última
línea la podíamos haber dividido en dos como la siguiente (Al execute no es necesario pasarle parámetros sino queremos, es más, en
este ejemplo no usamos para nada sus valores, aunque podríamos si quisiéremos).
Y dentro de nuestra clase “MainActivity” declararemos una clase privada llamada “DescargarImagenesDeInternetEnOtroHilo”.
Voy a poner todo el código seguido (En el primer vistazo al código puede que te eche para atrás, pero si omites los comentarios en
gris apenas son unas pocas líneas de código ) y lo explicaré por partes abajo.
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 6/41
16-01-2019 AsyncTask en Android - Jarroba
/**
* Contructor de ejemplo que podemos crear en el AsyncTask
*
* @param en este ejemplo le pasamos un booleano que indica si hay más de 100 archivos o no. Si le pasa
s true se cancela por la mitad del progreso, si le pasas false seguirá hasta el final sin cancelar la descarga simulada
*/
public DescargarImagenesDeInternetEnOtroHilo(boolean cancelarSiHayMas100Archivos) {
this.cancelarSiHayMas100Archivos = cancelarSiHayMas100Archivos;
}
/**
* Se ejecuta antes de empezar el hilo en segundo plano. Después de este se ejecuta el método "doInBack
ground" en Segundo Plano
*
* Se ejecuta en el hilo: PRINCIPAL
*/
@Override
protected void onPreExecute() {
TV_mensaje.setText("ANTES de EMPEZAR la descarga. Hilo PRINCIPAL");
Log.v(TAG_LOG, "ANTES de EMPEZAR la descarga. Hilo PRINCIPAL");
/**
* Se ejecuta después de "onPreExecute". Se puede llamar al hilo Principal con el método "publishProgre
ss" que ejecuta el método "onProgressUpdate" en hilo Principal
*
* Se ejecuta en el hilo: EN SEGUNDO PLANO
*
* @param array con los valores pasados en "execute"
* @return devuelve un valor al terminar de ejecutar este segundo plano. Se lo envía y ejecuta "onPostE
xecute" si ha termiado, o a "onCancelled" si se ha cancelado con "cancel"
*/
@Override
protected Integer doInBackground(String... variableNoUsada) {
int cantidadImagenesDescargadas = 0;
float progreso = 0.0f;
//Suponemos que tenemos 200 imágenes en algún lado de Internet. isCancelled() comprueba si hemo
s cancelado con cancel() el hilo en segundo plano.
while (!isCancelled() && cantidadImagenesDescargadas<200){
cantidadImagenesDescargadas++;
Log.v(TAG_LOG, "Imagen descargada número "+cantidadImagenesDescargadas+". Hilo en SEGUN
DO PLANO");
progreso+=0.5;
https://jarroba.com/asynctask-en-android/ 7/41
16-01-2019 AsyncTask en Android - Jarroba
}
}
return cantidadImagenesDescargadas;
}
/**
* Se ejecuta después de que en "doInBackground" ejecute el método "publishProgress".
*
* Se ejecuta en el hilo: PRINCIPAL
*
* @param array con los valores pasados en "publishProgress"
*/
@Override
protected void onProgressUpdate(Float... porcentajeProgreso) {
TV_mensaje.setText("Progreso descarga: "+porcentajeProgreso[0]+"%. Hilo PRINCIPAL");
Log.v(TAG_LOG, "Progreso descarga: "+porcentajeProgreso[0]+"%. Hilo PRINCIPAL");
miBarraDeProgreso.setProgress( Math.round(porcentajeProgreso[0]) );
}
/**
* Se ejecuta después de terminar "doInBackground".
*
* Se ejecuta en el hilo: PRINCIPAL
*
* @param array con los valores pasados por el return de "doInBackground".
*/
@Override
protected void onPostExecute(Integer cantidadProcesados) {
TV_mensaje.setText("DESPUÉS de TERMINAR la descarga. Se han descarcado "+cantidadProcesados+" i
mágenes. Hilo PRINCIPAL");
Log.v(TAG_LOG, "DESPUÉS de TERMINAR la descarga. Se han descarcado "+cantidadProcesados+" imáge
nes. Hilo PRINCIPAL");
TV_mensaje.setTextColor(Color.GREEN);
}
/**
* Se ejecuta si se ha llamado al método "cancel" y después de terminar "doInBackground". Por lo que se
ejecuta en vez de "onPostExecute"
* Nota: Este onCancelled solo funciona a partir de Android 3.0 (Api Level 11 en adelante). En versione
s anteriores onCancelled no funciona
*
* Se ejecuta en el hilo: PRINCIPAL
*
* @param array con los valores pasados por el return de "doInBackground".
*/
@Override
protected void onCancelled (Integer cantidadProcesados) {
TV_mensaje.setText("DESPUÉS de CANCELAR la descarga. Se han descarcado "+cantidadProcesados+" i
mágenes. Hilo PRINCIPAL");
Log.v(TAG_LOG, "DESPUÉS de CANCELAR la descarga. Se han descarcado "+cantidadProcesados+" imáge
nes. Hilo PRINCIPAL");
TV_mensaje.setTextColor(Color.RED);
}
Creo que está bastante documentado el código y ya deberías de ser capaz de deducir prácticamente todo, pero aun así lo
explicaré para no dejar ninguna duda al aire. Al crear el objeto de la clase “DescargarImagenesDeInternetEnOtroHilo” entraremos
primero en el constructor y nada más. Al llamar a execute() le decimos al AsyncTask que ponga en marcha el hilo en segundo plano.
Haciendo lo siguiente:
ACEPTAR
https://jarroba.com/asynctask-en-android/ 8/41
16-01-2019 AsyncTask en Android - Jarroba
Fíjate que todas las llamadas a las Views (al TextView) se hacen desde los métodos que empiezan por “on”. Si lo hubiéramos
hecho en el doInbackground directamente daría error al incumplirse una de las normas.
Por cierto, no dejes de echar un vistazo al Log mientras se ejecuta la aplicación. Si mientras se realiza la acción de descarga
(mientras se va llenando la barra), hicieramos clic tres veces en el botón, obtendríamos un Log similar al siguiente (puede que la
siguiente salida del Log la veas diferente; esto es porque la hemos limpiado para quedarnos con lo importante, colocado para que se
vea de un vistazo y resumido).
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 9/41
16-01-2019 AsyncTask en Android - Jarroba
...Haciendo otra cosa el usuario sobre el hilo PRINCIPAL a la vez que carga...
...Haciendo otra cosa el usuario sobre el hilo PRINCIPAL a la vez que carga...
...Haciendo otra cosa el usuario sobre el hilo PRINCIPAL a la vez que carga...
En el Log se aprecia muy bien como se entrelazan los hilos, y como uno actúa a la vez que el otro (es mejor verlo en directo,
mientras funciona). Y también, estate atento a que si invocamos publishProgress(), no se llama de inmediato a onProgressUpdate(),
queriendo decir con esto, que este método está principalmente diseñado para dar feedback al usuario.
En el AsyncTask se introducen aspectos avanzados de Java, que puede que no conozcas. Para ello las dos siguientes notas te
aclararán del todo los entresijos.
Nota sobre la Inferencia de tipos (<Tipo>) Si nunca has visto nada de inferencia de tipos, seguramente te sorprenderá ver
tipos (Integer, String, etc) entre los símbolos de “mayor que” yUso
“menor que”. Como en la cabecera de la anterior clase:
de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 10/41
16-01-2019 AsyncTask en Android - Jarroba
Habrás descubierto al final que aparece: <String, Float, Integer> Esto es una habilidad que tiene Java y se sirve para hacer a las
variables genéricas. ¿Qué quiere decir genéricas? Que la variable puede ser del tipo que tú quieras; es decir, si te interesara que sean
todas las variables de tipo Strings podrías poner:
¿Y por qué te puede interesar? Porque los métodos que tiene la clase usarán estas variables con el tipo que tu hayas definido,
si necesitas que sea un String ¿Por qué no? Y si necesitas que alguna sea entera, pues también. La única condición es que no se
permiten tipos primitivos solo tipos objetos; queremos decir con esto que para un entero no se puede poner “int”, sino “Integer” –
para efectos es lo mismo. De la anterior nota, veamos el código entero coloreado con sus tipos inferidos. Fíjate en la cabecera de la
clase los tres colores, y como se propagan hacia los tipos de las variables de los métodos que sobrescribe.
(https://jarroba.com/wp-content/uploads/2013/09/Codigo-Asynktask-de-Android-Facil-www.Jarroba.com_.png)
¿Y por qué te puede interesar? Porque los métodos que tiene la clase usarán estas variables con el tipo que tu hayas definido,
si necesitas que sea un String ¿Por qué no? Y si necesitas que alguna sea entera, pues también. La única condición es que no se
permiten tipos primitivos solo tipos objetos; queremos decir con esto que para un entero no se puede poner “int”, sino “Integer” –
para efectos es lo mismo.
De la anterior nota, veamos el código entero coloreado con sus tipos inferidos. Fíjate en la cabecera de la clase los tres
colores, y como se propagan hacia los tipos de las variables de los métodos que sobrescribe.
Nota sobre los argumentos variables (…) Puede que sea la primera vez que veas tres puntos en Java como la siguiente línea
de código:
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
protected void onProgressUpdate(Float... porcentajeProgreso)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 11/41
16-01-2019 AsyncTask en Android - Jarroba
E incluso te sonará a chino, pero tranquilo. Los tres puntos es casi lo mismo que un array. Me explico, cuando es la variable
que se le pasa a una función se trabaja igual que un array normal y corriente:
Solo cambia a la hora de llamar a la función. Si la llamamos como un array normal de toda la vida, ni lo notaremos:
Pero si te digo que gracias a los tres puntos suspensivos, podemos meterle directamente un solo valor, directamente como:
O dos:
O tres:
O ninguno:
hacer ();
O todos los que queramos directamente, sin tener que declarar el array. Se puede decir que se adaptan los valores que toma
la función a lo que necesitamos. Aunque lo que realmente hace es cogerlo todos juntos y meterlos en un array para después trabajar
con él como ya vimos. Y como todo array tiene un tamaño (recuerdo que si llamamos a una posición del array que no existe
tendremos un bonito error “java.lang Array Index Out Of Bounds Exception”), y se puede recorrer (con for, foreach, while, etc).
Con esto te dejo el código y terminamos: Pulsa aquí para descargar el código completo y funcional del ejemplo de AsyncTask
para Android (https://github.com/jarroba/AsyncTask)
No podemos despedirnos sin hacer referencia a la página oficial de Android sobre hilos:
http://developer.android.com/guide/components/processes-and-threads.html
(http://developer.android.com/guide/components/processes-and-threads.html)
Comparte
Usoesta entrada en:
de cookies
(htt
(htt
(htt (htt
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ps:/ ps:/ ps:/ ps:/
ACEPTAR
https://jarroba.com/asynctask-en-android/ 12/41
16-01-2019 AsyncTask en Android - Jarroba
2Fja url= A%
(https://creativecommons.org/licenses/by-nc-sa/3.0/es/) +An
(https://www.safecreative.org/userfeed/1401310112503)
AsyncTask en Android (https://jarroba.com/asynctask-en-android/) por "www.jarroba.com" esta bajo una licencia Creative Commons
rro http 2F% droi
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com (https://jarroba.com/asynctask-en-android/)
ba.c s%3 2Fja d -
75 thoughts on “AsyncTaskom
enA% rro http
Android”
%2F 2F% ba.c s%3
Delcil dice: asy 2Fja om A%
ncta rro %2F 2F%
24/09/2018 a las 22:26 (https://jarroba.com/asynctask-en-android/#comment-222412)
Hola amigo:
sk- ba.c asy 2Fja
Estoy realizando una aplicación que envía imágenes a un servidor web async-http, lo que quiero es que un hilo secundario
gestione este envío. El envío con AsynckHttp tieneen- om onsuccess
un evento ncta rroel cual sucede cuando termina de enviar los datos,
precisamente como notificaria a doInBackground para informar que una imagen ha sido enviado y asi mostrar el progreso. He
probado con un while dentro de doInBackgroundand %2F sk-
consultando ba.c
con una variable compartida pero no logro funcionar. Algún
alcance por favor.
roid asy en- om
Responder %2F ncta and %2F
syn +An )
(http://jarroba.com/faq/)
https://jarroba.com/asynctask-en-android/ 13/41
16-01-2019 AsyncTask en Android - Jarroba
Responder
Se puede utilizar un AsyncTask por cada Fragment, sino quieres repetir código puedes crear una clase aparte e
instanciarla directamente o heredar de AsyncTask para crear el tuyo propio. Utilizar un Singleton no es muy
recomendado pues puede dar problemas al compartir la ejecución entre Fragments con AsyncTask sino se programa con
cuidado.
Responder
Javier dice:
Responder
joel dice:
Buenas, queria consultarte el porque mi codigo no toma el "if" pero si el "else"? si cambio las condicion del if (quito "!") si
me funciona y el que deja de funcionar es el "else". Desde ya muchas gracias.
ACEPTAR
https://jarroba.com/asynctask-en-android/ 14/41
16-01-2019 AsyncTask en Android - Jarroba
if (!user.equals(RegistrarDni)){
Toast.makeText(getApplicationContext(),"Nuevo Registro",Toast.LENGTH_LONG).show();
Intent ingresar = new Intent(RegistroSistema.this, UsuarioNuevo.class);
ingresar.putExtra("DNIregistro", RegistrarDni);
startActivity(ingresar);
}else {
Toast.makeText(getApplicationContext(),"Usuario Existente",Toast.LENGTH_LONG).show();
}
}catch (JSONException e){
e.printStackTrace();
}
}
}
Responder
Aquí lo mejor que puedes hacer es comprobar que valores te devuelve antes del if las variables user y
RegistrarDni, pues es donde está el problema. También el equals() es un poco peculiar para ciertos objetos, así que
dependerá de los objetos que sean tus variables (si son Strings debería de funcionar bien).
Responder
Hola desde México, como puedo hacer para que un audio se reprodusca usando la clase AsyncTask
Responder
Para el audio cadsi mejor utiliza MediaPlayer sobre un Service. Más información
en https://developer.android.com/guide/topics/media/mediaplayer.html#mpandservices
(https://developer.android.com/guide/topics/media/mediaplayer.html#mpandservices)
Responder
felipeunefa dice:
Uso de cookies
Responder
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 15/41
16-01-2019 AsyncTask en Android - Jarroba
Responder
Jorge dice:
Explicación
Responder
Responder
Hola Ramon Invarato , hola A todos los que estan leyendo este mensaje , pues bien es que tengo una duda y no se
como preguntar en internet acerca de esto, es que no entiendo esta construccion del codigo en la parte de la clase que
extiende de AsyncTask ->
mi pregunta es :
Para que sirven esos parametros que Tiene AsyncTask , Que representa esto?
Responder
(http://jarroba.com/faq/)
private Integer valor:
ACEPTAR
https://jarroba.com/asynctask-en-android/ 16/41
16-01-2019 AsyncTask en Android - Jarroba
En la anterior clase el valor es siempre entero, ¿Qué pasa si queremos que sea cualquiera? Pues
Con los tipos genéricos puede ser cualquier cosa una misma variable.
Responder
carlos dice:
Responder
mayitin3 dice:
Hola Ramon, tengo una duda, necesito algo muy basico pero que me tiene loco, estoy usando una base de datos sqlite
encriptada con sqlitecipher , el asunto es que se demora un mundo en cargar porque el sqlcipher es bien lento , mi aplicaci'on
se va a usar en cels actuales (donde el tiempo de carga es infimo) pero en antiguos tambien (froyo) donde la pausa es
exttemadamente laga puede llegar a los 10 segundos con solo abrir una base de datos con solo un registro, como puedo hacer
en asynctask para que mientras la app este leyendo la base de datos muestre una ventana de cargando por favor (para que el
usuario se de cuenta que no hay problemas ) y que cuando termine de cargar la base se quite de la pantalla.
saludos
Responder
Hola. Te recomiendo que en segundo plano (doInBackground) hagas el descifrado de datos, mientras notificas al
usuario con una ventana emergente. Con este tutorial tienes todo lo que necesitas, solo te queda poner el cifrado en
Uso de cookies
segundo
Este sitio web plano
utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
Responder ACEPTAR
https://jarroba.com/asynctask-en-android/ 17/41
16-01-2019 AsyncTask en Android - Jarroba
Un buena explicacion y control de asynctask en android. es muy productivo este articulo gracias.
Responder
Jorge dice:
Hola, tengo problemas en mi aplicacion android con el sockettimeout y las asynctask… ¿como puedo sacar un mensaje
Toast (por ejemplo) en mi activity, si no consigue conectar al servidor, por que esta apagado o no es correcta la direccion IP?
catch (SocketTimeoutException e)
{
e.printStackTrace();
}
…
Desde el doInBackground (en otra clase ‘CargarLista’) llamo al metodo conectar anterior:
Dado que conectar se ejecuta en un hilo y el doInBackground se ejecuta en otro hilo diferente al principal, no puedo
capturar el SocketTiemoutException. ¿Que hago para avisar que han pasado los 5 segundos de espera? ¿Donde saco el
mensaje Toast? ¿Voy desencaminado?
Gracias!
Responder
Uso de cookies
Ramón [Admin Jarroba] dice:
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
18/02/2015 a las 14:34 (https://jarroba.com/asynctask-en-android/#comment-10544)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 18/41
16-01-2019 AsyncTask en Android - Jarroba
Hola Jorge,
puedes saber que mensaje de error devuelve el mensaje del servidor al establecer la conexión con HttpURLConnection
con la conexión, te devuelve el número del error el método getResponseCode().
Responder
pablo dice:
Responder
pablo dice:
Responder
Responder
Hola Pablo,
en ejecución no se puede pasar variables por los métodos normales desde fuera de la clase que hereda de
AsyncTask. Podrías crear una variable global y modificarla mientras se ejecuta, pero te puede dar problemas.
Responder
Responder
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 19/41
16-01-2019 AsyncTask en Android - Jarroba
Hola estoy haciendo un curso de android y en la practica del tema 4 consiste en realizar una aplicación con la que
cargaremos en los maps de Google imágenes que estarán geoposicionadas. Dichas imágenes estarán almacenadas en una
base de datos de MySQL y dispondremos de un servidor php real. Veremos cómo configurar dicho servidor. Cuando
arranquemos la aplicación, nos cargará el mapa en la posición en la que nos encontramos, y nos mostrará las imágenes que
nosotros hayamos configurado que se las descargarán directamente del servidor, a través de la red, que hemos configurado
previamente en la web.
La aplicación cuando la ejecuto en el emulador o en mi telefono y doy a cualquier opcion para que me muestre la
posicion donde está el establecimiento se para la aplicación.
package com.learnimbus.locations.activityprincipal;
import java.util.ArrayList;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.learnimbus.locations.herramientasmapas.Localizaciones;
import com.learnimbus.locations.herramientasmapas.WebserviceUtil;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.sax.StartElementListener;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapa);
mapa = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
// Recuperamos los lugares depende de la que se haya pulsado
}
(http://jarroba.com/faq/)
} ACEPTAR
https://jarroba.com/asynctask-en-android/ 20/41
16-01-2019 AsyncTask en Android - Jarroba
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.learnimbus_locations_valladolid, menu);
return true;
}
@Override
protected String doInBackground(Void… params) {
WebserviceUtil webservice = new WebserviceUtil();
ArrayList listalocations = webservice.cargarLocalizaciones(tipoRecibido);
listadomarcadores = new ArrayList();
for(int i=0; i < listalocations.size(); i++){
Localizaciones localizacionObj = listalocations.get(i);
String cordenadas[] = { localizacionObj.getLongitud(), localizacionObj.getLatitud() };
double lat = Double.parseDouble(cordenadas[0]);
double lng = Double.parseDouble(cordenadas[1]);
int icono = R.drawable.learnimbusmenu;
if(localizacionObj.getTipo().equals("BANCO")){
icono = R.drawable.visa;
}else if(localizacionObj.getTipo().equals("GASOLINERA")){
icono = R.drawable.gas;
}else if(localizacionObj.getTipo().equals("HOSPITAL")){
icono = R.drawable.hospital;
}else if(localizacionObj.getTipo().equals("RESTAURANTE")){
icono = R.drawable.restaurant;
}else if(localizacionObj.getTipo().equals("TIENDA")){
icono = R.drawable.shop;
}else if(localizacionObj.getTipo().equals("LEARNIMBUS")){
icono = R.drawable.learnimbusmenu;
}
@Override
Uso de cookies
protected void onPostExecute(String result) {
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
super.onPostExecute(result);
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 21/41
16-01-2019 AsyncTask en Android - Jarroba
((LearnimbusLocationsValladolid)this.applicationContext).TaskCallback();
}
}
}
_______________________________________________________________________________________
package com.learnimbus.locations.activityprincipal;
import java.util.ArrayList;
import com.learnimbus.locations.herramientasmapas.Local;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@Override
public void onCreate(Bundle savedlnstanceState){
super.onCreate(savedlnstanceState);
setContentView(R.layout.lista);
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Bundle bundle = new Bundle();
Local local = (Local) l.getItemAtPosition(position);
// Cargamos el Bundle con la coleccion de objetos que pasaremos
// a la siguiente vista Bundle bundle = new Bundle();
bundle.putString(MyKey, local.getLocalName());
// Creamos la vista de Lista de objetos y le pasamos la
// colección de objetos a mostrar
Intent mylntent = new Intent(this, LearnimbusLocationsValladolid.class); mylntent.putExtras(bundle);
startActivityForResult(mylntent, 0);
} Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 22/41
16-01-2019 AsyncTask en Android - Jarroba
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 23/41
16-01-2019 AsyncTask en Android - Jarroba
@Override
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView;
if(v == null){
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.iconrow, null);
}
Local o = items.get(position);
if(o != null){
// poblamos la lista de elementos
TextView tt = (TextView) v.findViewById(R.id.row_toptext);
ImageView im = (ImageView) v.findViewById(R.id.icon);
if(im != null){
im.setImageResource(o.getLocalImage());
}
if(tt != null){
tt.setText(o.getLocalName());
}
}
return v;
}
}
}
_________________________________________________________________________________________
package com.learnimbus.locations.herramientasmapas;
}
_____________________________________________________________________________________
package com.learnimbus.locations.herramientasmapas
public class Localizaciones {
private int ID;
private String NOMBRE;
private String DESCRIPCION;
private String LONGITUD;
private String LATITUD;
private String TIPO; Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 24/41
16-01-2019 AsyncTask en Android - Jarroba
}
________________________________________________________________________________________
package com.learnimbus.locations.herramientasmapas;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONArray;
Uso de cookies
import org.json.JSONException;
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
import org.json.JSONObject;
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 25/41
16-01-2019 AsyncTask en Android - Jarroba
/**
* Recupera las ciudades desde el webservice
* @return ArrayList
*/
public ArrayList cargarLocalizaciones(String tipo){
String url = “http://pruebaslearnimbus.herobo.com/consultas.php?formato=JSON&action=”+tipo;
ArrayList listaLocalizaciones = null;
// Parse
JSONArray jArray = cargaDesdeWebservice(url);
JSONObject e;
try {
e = jArray.getJSONObject(i);
String s = e.getString("post");
JSONObject jObject = new JSONObject(s);
return listaLocalizaciones;
}
/**
* Conecta y recupera la cadena JSON del webservice
* @param url
* @return
*/
private JSONArray cargaDesdeWebservice(String url){
JSONArray jArray = null;
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 26/41
16-01-2019 AsyncTask en Android - Jarroba
// Parse
JSONObject json = new JSONObject(responseBody);
jArray = json.getJSONArray(“posts”);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jArray;
}
}
______________________________________________________________________________________
Androidmanifest.xml
______________________________________________________________________________________
iconrow.xml
_______________________________________________________________________________________
lista.xml
______________________________________________________________________________________
mapa.xml
_______________________________________________________________________________________
consultas.php
$post);
}
}
if($formato == ‘json’) {
header(‘Content-type: application/json’);
echo json_econde(array(‘posts’=>$posts));
} Uso de cookies
else
Este { utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
sitio web
header(‘Content-type: text/xml’);
(http://jarroba.com/faq/)
echo ‘ ‘; ACEPTAR
https://jarroba.com/asynctask-en-android/ 27/41
16-01-2019 AsyncTask en Android - Jarroba
@mysql_close($link);
}
?>
_____________________________________________________________________________________
Hay algún error en alguno de los códigos?
Responder
Hola Noelia,
Responder
Responder
Responder
Vale, este error se suele dar cuando intentas mostrar algo de la interfaz gráfica desde el segundo
plano. Te recomiendo que repases la teoría de http://jarroba.com/multitarea-en-android/
(http://jarroba.com/multitarea-en-android/) y que revises el código en el doInBackground().
Uso de cookies
Ramón [Admin Jarroba] (http://www.jarroba.com) dice:
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
21/11/2014 a las 00:51 (https://jarroba.com/asynctask-en-android/#comment-1186)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 29/41
16-01-2019 AsyncTask en Android - Jarroba
El típico clase no encontrada, suele ser complicado de encontrar el fallo pero luego siempre es alguna
tontería. Tenemos una solución que te puede servir en: http://jarroba.com/error-android-java-lang-
noclassdeffounderror-sin-motivo-aparente/ (http://jarroba.com/error-android-java-lang-
noclassdeffounderror-sin-motivo-aparente/) . Además, comprueba que el AndroidManifest esté bien formado
Responder
Por mas que lo he leido los manuales y demás no veo que tengo que modificar en el
doinbackground para que me funcione el proyecto. Si me lo puedes revisar a ver que tengo que
modificar.
Huele un poco la última línea antes del return, donde haces listadomarcadores.add(), por estar
asignando un icon al mapa puede que esté dando problemas ahí. Prueba a comentarla y a ver que pasa.
https://jarroba.com/asynctask-en-android/ 30/41
16-01-2019 AsyncTask en Android - Jarroba
Prueba a comentar esa línea y las referencias que tenga (posiblemente por lo que te salga el
null). En otras palabras, vamos a depurar el código quitando todo lo que hace después para ver donde
puede estar el fallo.
pablo dice:
return null;
}
Responder
El probrema es en hacer por un lado algo en una Activity y lanzar un AsynckTask en otra Activity diferente. El
AsynckTask se asocia con la Activity, es decir, vive mientras viva y se ejecuta en segundo plano mientras esté la Activity al
frente del usuario. Las soluciones depende de la necesidad son: puedes o bien meter el AsyncTask en un Fragment para
hacer todo junto en la misma Activity; o bien crear un Service.
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/) Responder
ACEPTAR
https://jarroba.com/asynctask-en-android/ 31/41
16-01-2019 AsyncTask en Android - Jarroba
pablo dice:
Eso lo tengo claro: un asyncTask para cada activity… el problema es que no sale mensaje de error ni nada, es
como si no ejecutara:
logeo (con su propio asynctask)
habilita el menu principal que es una lista que se solicita a la bd por medio de su propio asyntask
y la lista no aparece.
Probe poniendo mensajes en casi to el codigo del Activity, pero cuando ejecuto el asyntask, el codigo de
doInBackground: no realiza acción alguna, solo lo hace el preExecute(pero es obvio por que corresponde al hilo
principal).
Despues lo probe unitariamente y si funciona, sin ningun problema, entonces no se lo que ocurre.
Solo entiendo que falla la integracion
Responder
Haz una cosa, lanza los dos hilos a la vez desde el mismo Activity y me dices que te sale.
Dando una segunda vuelta a tu código he visto que lanzas un Toast dentro del doInBackground(), no
deberías lanzarlo ahí, pues dibuja en pantalla y podría darte problemas.
Responder
pablo dice:
ok, mira el codigo y me dices que encuentras, pero para recordar, unitariamente funcionan, al
realizar la integracion es que falla
[Dato borrado por seguridad. Más información en http://jarroba.com/faq/ (http://jarroba.com/faq/) ]
He revisado el código. Lo que te está ocurriendo es tienes una Activity con un AsyncTask, que
obtiene el JSON para abrir una nueva Activity con otro AsyncTask. Por lo que el primer AsyncTask deja
de funcionar pues su Activity quedó oculta. Por eso te funcionan sueltos pero no juntos. Te recomiendo
que uses Fragments o que lances el otro AsyncTask sin abrir otra Activity, esto depende del diseño.
Borro los links al código por tu privacidad; te aconsejo que cambies las claves que tienes en el
código y que pongas como privado los links
pablo dice:
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 32/41
16-01-2019 AsyncTask en Android - Jarroba
Sí, podrías hacer eso. En tu caso lo mejor es que crees los AsyncTask en clases individuales, así
no tendrías problemas con la segunda Activity. Si necesitas que el usuario vea algo, puede que tengas
que plantear usar Fragments.
pablo dice:
OLA, resolví el problema, ingenuamente dejaba la conexión del socket abierto, entonces el
asynctask quedaba corriendo, por lo tanto el llamado que realizaba al principio siempre se generaba
dentro del hilo principal y la conexión del socket. Por lo que era como tratar llamar al socket dentro del
socket….
De nada Pablo, son cosas que pasan cuando se programa y de todo se aprende. ¡Ánimo!
Carlos dice:
Responder
https://jarroba.com/asynctask-en-android/ 33/41
16-01-2019 AsyncTask en Android - Jarroba
tienes un par de opciones, o bien creas otra clase Java aparte, o creas una clase anidada que herede de
AsynkTask. En este ejemplo utilizamos una clase anidada interna (inner class) y privada (es decir una clase tiene dentro
otra clase, de igual manera que los métodos). Para que te quede más claro, echa un vistazo aquí, el primer ejemplo es
aclaratorio: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
(http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)
Responder
paulC dice:
Hola estimado jarroba, estoy desarrollando una aplicación donde tengo que graficar los datos de un sensor
provenientes de un servidor web vía wifi, así que para esto use la clase asyncTask que me permite recibir los datos en un hilo
paralelo, y la recepción esta hecha usando sockets y configurado el android como cliente. Los datos los voy graficando en
tiempo real en un androidPlot, es decir la curva se va formando a medida que llegan lo datos, hasta ahí no hay ningún
problema. Pero usando el mismo plot debo graficar 2 curvas de 2 sensores diferentes, primero una y luego la otra, cada sensor
me enviará 100 valores cada vez que desde la interfaz se le diga que empiece a enviar los datos, y como los sensores están
midiendo cosas diferentes el rangeLabe y el domainLabel tienen cambiar de acuerdo a la curva que se este dibujando. Para
esto he puesto dos botones en el hilo principal, uno por cada sensor, por ahora lo único que quiero es que cada botón
simplemente cambie los nombres del range y el domain para que correspondan con las medidas de su sensor. Y aquí es donde
tengo el problema puesto que los botones no responden, no cambian el nombre de los ejes. Solo lo hacen cuando ya estoy
recibiendo datos pero no antes que es cuando necesito. No se cuál es el problema, pero si me puedes ayudar te estaría
infinitamente agradecido…
Responder
Hola PaulC,
Por lo que comentas seguramente esté inicializando los botones al comenzar el intercambio de datos. Inicializa los
botones en la Activity en el onCreate().
Responder
Lenin dice:
Hola buenas usando asynctask con activity todo me funciona perfecto. La pregunta es como seria usando fragment??
Ya que probado con fragment y nunca ejecto el doinbackground.
Responder
ACEPTAR
https://jarroba.com/asynctask-en-android/ 34/41
16-01-2019 AsyncTask en Android - Jarroba
se hace igual que con Activity. Asegúrate que estés arrancando el Asynctask, el execute(), en el ciclo de vida del
Fragment (ejemplo en http://jarroba.com/programar-fragments-fragmentos-en-android/ (http://jarroba.com/programar-
fragments-fragmentos-en-android/))
Responder
Junior dice:
Hola una pregunta, que programa utilizas , para hacer esos diseños ( smartphones por ejemplo), o que programas me
recomiendas para hacer diseños para una presentación de un proyecto. Un saludo genios, los admiro
Responder
Hola,
para presentaciones lo más aconsejable es crear alguna con un editor de prestaciones (Powerpoint, presentaciones de
Drive, Prezzi, entre otros). No utilizamos un solo programa para los gráficos, utilizamos varios dependiendo de la
situación, pero así los que más utilizo personalmente son Visio, Gimp e Inkscape.
Responder
Junior dice:
Muchas gracias por responder Ramón , yo les sigo a ustedes desde hace mucho, por eso recurro a ustedes,
pero yo me refería que programa uso para dibujar “cualquier cosa”,o una instalación de climatización, o un simple
esquema, por ejemplo hoy vi unos dibujos de instalaciones de automatismo industrial con sus bombas de calor,
ventiladores, calderas, y mas cosas , y no creo que lo hayan hecho con paint. Un saludo y muchas gracias de
antemano cracks.
Responder
Para todo eso te recomiendo Visio, permite casi cualquier tipo de esquemas. Existen herramientas más
especializadas para cada desempeño, aunque yo solo te puedo ayudar en términos de Software.
Responder
jimmy dice:
Estimados, nada mas que agradecer infinitamente el nivel de detalle que utilizan para enseñar. Ojala hubieran mas
como ustedes.
Saludos. Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
Responder
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 35/41
16-01-2019 AsyncTask en Android - Jarroba
Hola señores Jarroba, estuvo muy bueno el tuto. Tengo una duda. Al momento de cambiar de actividad a una nueva, los
procesos que estan en segundo plano se siguen ejecutando, o se destruyen con la actividad que los ejecuto, para dar paso a la
nueva actividad.
Responder
Hola Omar,
para que se sigan ejecutando lo mejor es utilizar “Service”. “AsynkTask” solo asegura la ejecución mientras la Activity esté
viva y en pantalla.
Responder
Jose dice:
Es un cronometro y al darle a Cancelar sigue normalmente. S: Me podrias echar la mano por favor.
Responder
Hola Jose,
Por lo que comentas tienes bien implementadas las acciones de cancelar. Pero el problema puede venir por varios
motivos. Primero que lo estés ejecutando en una versión antigua de Android y no soporte el método onCancelled()
(soportado desde el API 11), por lo que el hilo seguirá funcionando (para solventar esto no queda más que tratar la acción
de cancelar a mano). Otro problema puede ser que estés llamando al método onCancelled() que es el antiguo y no
funciona correctamente; tienes que llamar al que se le pasan parámetros, que sí funciona, que es onCancelled(Result
result).
Responder
Jose dice:
(http://jarroba.com/faq/)
o algo asi lo he intentado y no se por que nunca se detiene.
ACEPTAR
https://jarroba.com/asynctask-en-android/ 36/41
16-01-2019 AsyncTask en Android - Jarroba
Anteriormente habia probado hacerlo con Thread y con el handler escribir en la interfaz y tambien escribia
todo
bien pero no podia detenerlo por los mismos motivos, no se que es lo q estoy haciendo mal.
Responder
Es raro, posiblemente no estés llamando a la instancia del hilo. Cópianos el código, te lo reviso y te
digo
Responder
Jose dice:
if (v.getId() == findViewById(R.id.botonIniciar).getId()) {
b.execute();
}
if (v.getId() == findViewById(R.id.botonCancelar).getId()) {
b.cancel(true);
}}
Button boton;
@Override
protected Result doInBackground(Void… params) {
Uso de cookies
int i;
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
for(i = 1; i<20; i++){
(http://jarroba.com/faq/)
dormir(i); //es un metodo de la clase q es el q lleva el thread.sleep()
ACEPTAR
https://jarroba.com/asynctask-en-android/ 37/41
16-01-2019 AsyncTask en Android - Jarroba
publishProgress(boton);
if(isCancelled()){break;} //aqui valida si fue cancelado
}
return null;
}
@Override
protected void onProgressUpdate(Button… values) {
super.onProgressUpdate(values);
boton.setBackgroundResource(obtenerImagen()); //obtener imagen es un metodo interno
}
@Override
protected void onCancelled(Result result) {
super.onCancelled(result);
}
}
He probado el código que me has mandado y funciona bien, cancela al pulsar el botón. Puede
que lo que te pase es que cancelas cuando acaba, al tener tan pocas iteraciones el bucle termine antes
de que puedas siquiera pulsar el botón.
También he visto que asignas el evento de clicado desde el XML (ya hace tiempo que no lo
recomiendo en favor de la asignación en Java con setOnCLickListener(), aunque en este caso no da
problemas). En caso de que lo quieras así, asegúrate de que estás llamando a la función onClick() que
has declarado en Java, como en este ejemplo:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_marginLeft="64dp"
android:layout_marginTop="29dp"
android:layout_toRightOf="@+id/textView1"
android:onClick="onClick"
android:text="Button" />
Prueba a loguear el código, te paso como lo he probado y te funciona bien:
@Override
protected Result doInBackground(Void... params) {
int i;
for (i = 1; i < 200; i++) { Log.v("test",
Uso de cookies
"iteración" + i); try { //Simula el tiempo aleatorio de
descargar una imagen, al dormir unos milisegundos aleatorios al hilo en segundo plano
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
https://jarroba.com/asynctask-en-android/ 38/41
16-01-2019 AsyncTask en Android - Jarroba
Jose dice:
public class BotonLetraAnimar extends AsyncTask ** (lleva esos parametros q no puse perdon)
Hola, una consulta. comprendo lo que está aquì y està muiy bueno.
en un proyecto se mne ha hecho necesario usar un asynctask dentro de otro.
y no logro hacer cambios en la GUI desde el segundo hilo que está dentro del primero.
en fin lo que tengo es eso:
hilo principal
-> asyncTaks1 (desde acá puedo hacer un setText())
-> asyncTask2 (desde acá puedo NO hacer un setText())
atte.
Responder
Buenas Nelson,
Por lo que nos cuentas puede ser por llamar a la UI desde el doInBackground(). Te recomiendo que leas este
artículo para entender la razón: http://jarroba.com/multitarea-en-android/ (http://jarroba.com/multitarea-en-android/)
Responder
Marc-k86 dice:
Que tal amigo como harías esto pero el asynctask en una clase diferente a la mainactivity como le asignarías el valor al
textview desde la clase asynctask?
Responder
(http://jarroba.com/faq/)
Buenas Marc-k86,
ACEPTAR
https://jarroba.com/asynctask-en-android/ 39/41
16-01-2019 AsyncTask en Android - Jarroba
sólo tienes que pasar la variable TextView en el constructor del AsynkTask y luego usarla dentro de este (recuerda
de utilizar las Views sobre el hilo principal).
Responder
Muy buen post gracias, una consulta como puedo publicar el progreso si el progreso se realiza en una clase distinta,
me explico:
doInBackground(void){
Usuario.obtenerUsuarios();
}
como puedo publicar el progreso si la tarea la realizo en otra clase, gracias de antemano
Responder
Buenas Gonzalo,
si es una clase normal, dentro del propio cuerpo del AsyncTask, en su constructor, puedes instanciar la clase y
usarla de manera normal. Eso sí, ten en cuenta que la clase no utilice nada de la interfaz gráfica como se indica en el
artículo.
Responder
mary dice:
Responder
Deja un comentario
Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *
(http://jarroba.com/faq/)
Nombre *
ACEPTAR
https://jarroba.com/asynctask-en-android/ 40/41
16-01-2019 AsyncTask en Android - Jarroba
Correo electrónico *
Web
Publicar comentario
Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios
(https://akismet.com/privacy/).
(/)
Siguenos en:
(https://www.youtube.com/user/Jarrobaweb) (https://twitter.com/JarrobaWeb)
(https://www.facebook.com/jarrobaWeb) (https://github.com/jarroba?tab=repositories)
(https://plus.google.com/103352032205227460108/)
FAQ (HTTPS://JARROBA.COM/FAQ/)
VISITAS (HTTPS://JARROBA.COM/VISITAS/)
GASTOS
HERRAMIENTAS (HTTPS://JARROBA.COM/TOOLS/)
Uso de cookies
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies (http://jarroba.com/faq/)
(http://jarroba.com/faq/)
ACEPTAR
https://jarroba.com/asynctask-en-android/ 41/41