2010-07-21 39 views
5

La documentación de Android dice que se llama a AsyncTask postExecute() en el subproceso de interfaz de usuario. Tenía la impresión de que se llamaba postExecute() desde el subproceso donde se llamaba execute(): he estado usando una AsyncTask en un servicio en segundo plano con su propio subproceso, y se llamó a postExecute() en el subproceso de servicio, no al subproceso principal.
Sin embargo, recientemente tuve un problema con la ejecución de postExecute() en absoluto, mientras que se lanzó una excepción: "enviar un mensaje a un controlador en un hilo muerto".Android: ¿puede AsyncTask regresar en otro subproceso que el subproceso de interfaz de usuario?

¿Cómo es exactamente:
- se debe utilizar AsyncTask SOLAMENTE desde el hilo principal?
- En caso negativo, ¿en qué hilo se llamará postExecute(): siempre el subproceso UI o el subproceso execute()?

Gracias

+0

La documentación * parece * confusa para mí también, aunque no me he encontrado con el excepción que está obteniendo ha sido mi experiencia que cuando se utiliza 'AsyncTask' fuera de la interfaz de usuario, el subproceso' onPostExecute' ocurre a partir del subproceso de llamada y no necesariamente del subproceso de IU (y requiere un 'Manejador' si la IU necesita ser manipulada). –

Respuesta

14

Los métodos pre y postEjecución de AsyncTask se invocan en el subproceso en el que se creó la instancia de la tarea. Donde llama ejecutar() no importa. El hilo en el que crea la tarea debe ser un hilo looper y en la práctica siempre debe ser el hilo principal (o el hilo UI).

+0

¡Gracias por la respuesta concreta! –

+1

¿Sigue siendo así en el caso de la versión 4.1 o superior? Empecé una tarea asíncrona dentro del hilo del controlador, pero el resultado todavía está en el hilo principal. – Teodor

+0

¿Qué tal si tienes un oyente creado en un hilo diferente? si llama, ¿también se disparará en el hilo que se creó? – JY2k

2

parece que puede empezar AsyncTask de otro lugar que el hilo principal, pero la postExecute es realmente ejecutados en el hilo principal. Aquí está mi prueba, dime si parece lógico que:

public class AsyncLoader extends AsyncTask<Context, String, Boolean> { 
private ConnectivityManager cm; 
private ArrayList<Contact> nameList; 
private Context ctx; 
private static int i = 0; 

@Override 
protected Boolean doInBackground(Context... params) { 
    ctx = params[0]; 
    cm = (ConnectivityManager) params[0].getSystemService(Activity.CONNECTIVITY_SERVICE); 
    if (i < 3) { 
     i++; 
     new AsyncLoader().execute(ctx); 
     System.out.println("Thread name (from doInBackground) : " + Thread.currentThread().getName()); 
     System.out.println("compteur async " + i); 
    } 
    if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable()) { 
     nameList = (ArrayList<Contact>) ContactLoaderXml.loadContactsData(); //this is a loading from the web + sax parser 
     return true; 
    } else { 
     return false; 
    } 
} 
@Override 
protected void onPostExecute(Boolean result) { 
    super.onPostExecute(result); 
    System.out.println("Thread name (from postexecute) : " + Thread.currentThread().getName()); 
} 
} 

Aquí es el StackTrace después de las tareas:

I/System.out( 641): Thread name (from doInBackground) : AsyncTask #1 
I/System.out( 641): compteur async 1 
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #2 
I/System.out( 641): compteur async 2 
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #3 
I/System.out( 641): compteur async 3 
I/System.out( 641): Thread name (from postexecute) : main 
I/System.out( 641): Thread name (from postexecute) : main 
I/System.out( 641): Thread name (from postexecute) : main 
I/System.out( 641): Thread name (from postexecute) : main 

No sé por qué el posterior ejecución se hace 4 veces aunque ...

+0

Supongo que porque ha llamado ejecutar en su objeto para ingresar el primer doInBackground, entonces onPostexecute se llama 4 veces. No estoy seguro si anidar la creación de la tarea en doInBackground es una buena idea ... – user244129

Cuestiones relacionadas