termino - thread android
Iniciar tarea asÃncrona dentro de un hilo de trabajo (5)
Desde el documento de Android AsyncTask:
"La instancia de la tarea debe crearse en el subproceso de la interfaz de usuario".
"execute (Params ...) debe invocarse en el subproceso de la interfaz de usuario".
Por lo tanto, lo siguiente es legal.
new Thread(new Runnable() {
@Override
public void run() {
// do some work here
runOnUiThread(new Runnable() {
@Override
public void run() {
new MyAsyncTask(ctx).execute();
}
});
}
}).start();
Tengo dos preguntas:
- ¿Podemos iniciar / ejecutar una tarea asíncrona dentro de un subproceso de trabajo?
- En caso afirmativo, los métodos
onPreExecute()
,onProgressUpdate(Progress...)
yonPostExecute(Result)
se invocan en el subproceso de la interfaz de usuario?
Quiero saber eso porque tengo una conexión TCP que se ejecuta en un subproceso de trabajo y cuando se recibe un paquete, quiero iniciar un nuevo subproceso para analizar el paquete y, después, actualizar algunas estructuras de datos en el subproceso de la interfaz de usuario.
¡Gracias por adelantado!
De acuerdo con Android doco, debe ejecutar una AsyncTask desde un subproceso de la interfaz de usuario, pero en realidad depende de quién ejecute esta línea en AsyncTask.class primero:
private static final InternalHandler sHandler = new InternalHandler();
Si tiene una AsyncTask a la que se llama tanto desde la UI como desde el subproceso de trabajo, puede evitar esta restricción llamándola primero desde el subproceso de la IU. Si lo golpeas primero desde el hilo de tu trabajador, estás condenado. Prefiero no confiar en esto, ya que los detalles de la implementación pueden cambiar en cualquier momento, pero este conocimiento es útil si usted, como yo, se pregunta "por qué mi otra AsyncTask funciona".
Desde el documento de Android AsyncTask :
"La instancia de la tarea debe crearse en el subproceso de la interfaz de usuario".
"execute (Params ...) debe invocarse en el subproceso de la interfaz de usuario".
Así que creo que la respuesta a tu primera pregunta es "no". En cuanto al segundo, todos los métodos se invocan en el hilo de la interfaz de usuario, pero es un poco discutible.
EDITAR: No estoy seguro si esas son restricciones absolutas, o sugerencias fuertes, pero en ambos casos, recomendaría seguirlas.
En forma simple, podemos iniciar AsyncTask en un trabajador. Simplemente puede ejecutar una AsyncTask en un nuevo Thread, muy simple. La razón está en el código fuente de Android: [clike aquí]
private static class InternalHandler extends Handler {
public InternalHandler() {
super(Looper.getMainLooper());
}
}
Solo para el registro: si inicia una AsyncTask fuera del subproceso de la interfaz de usuario, onPreExecute no se ejecutará desde el subproceso de la interfaz de usuario (sino desde el subproceso de la persona que llama). Esto conducirá a una excepción. Sin embargo, el método onPostExecute siempre se ejecutará en el UI-Thread. Espero poder ayudar a alguien :)