runonuithread android android-handler android-thread

android - runonuithread - Cuándo usar handler.post() y cuándo a un nuevo tema()



handler postdelayed (4)

Debe usar Handler.post() siempre que desee realizar operaciones en el subproceso de la interfaz de usuario.

Así que digamos que en la devolución de llamada (que se está ejecutando en un hilo separado) que desea cambiar el texto de un TextView , debe usar Handler.post() .

En Android, como en muchos otros marcos de IU, los elementos de IU (widgets) solo pueden modificarse desde el hilo principal.

Editar: el ejemplo de tareas de larga duración

mHandler = new Handler(); new Thread(new Runnable() { @Override public void run () { // Perform long-running task here // (like audio buffering). // you may want to update some progress // bar every second, so use handler: mHandler.post(new Runnable() { @Override public void run () { // make operation on UI - on example // on progress bar. } }); } }).start();

Por supuesto, si la tarea que desea realizar es realmente larga y existe el riesgo de que el usuario cambie a alguna otra aplicación mientras tanto, debe considerar el uso de un Service .

Me pregunto cuándo debería usar handler.post(runnable); y cuándo debo usar el new Thread(runnable).start();

Se menciona en la documentación de desarrolladores para Handler:

Hace que el Runnable r se agregue a la cola de mensajes. El ejecutable se ejecutará en el subproceso al que se adjunta este controlador.

¿Significa esto si escribo en el onCreate() de la clase de Activity :

Handler handler = new Handler(); handler.post(runnable);

¿Entonces se ejecutará Runnable en un hilo separado o en el hilo de la Actividad?


Ejemplo es jacked:

mHandler = new Handler(); new Thread(new Runnable(){ @Override public void run () { mHandler.post(new Runnable() { @Override public void run () { mUiView.setX(x); } }); } }).start();

Alternativamente, puede omitir el controlador y usar el método de publicación directamente en la vista:

new Thread(new Runnable(){ @Override public void run () { mUiView.post(new Runnable() { @Override public void run () { mUiView.setX(x); } }); } }).start();

Esta es una buena publicación que destaca la diferencia: ¿Qué hace exactamente el método de publicación?


Para responder a su pregunta específica:

¿Significa esto si en la clase de actividad onCreate escribo:

Handler handler = new Handler () hanlder.post (ejecutable); entonces, ¿se podrá ejecutar runnable en un hilo separado o en el hilo de la Actividad?

No, no lo será. El Runnable será llamado en el hilo principal. El controlador simplemente se utiliza para publicar un mensaje en el hilo al que está adjunto (donde se crea). No crea un hilo por sí mismo. En su ejemplo, creó un controlador en el subproceso principal (donde se llama Activity.OnCreate ()) y, por lo tanto, cualquier mensaje publicado en dicho controlador se ejecutará solo en el hilo principal.


use handler.post() cuando desee publicar el código (generalmente desde el subproceso de fondo) en el subproceso principal . Sí, POST, igual que tú, publica una carta a alguien. Con la ayuda del controlador, el código se ejecutará lo antes posible, es decir, casi de inmediato.