Cuando necesito que algo se ejecute de forma asincrónica , como una tarea de larga ejecución o una lógica que utiliza la red, o por cualquier razón, iniciar un nuevo subproceso y ejecutarlo funciona bien. La creación de un Handler y funcionando funciona así. ¿Cual es la diferencia? ¿Cuándo debo usar cada uno? ¿Cuáles son las ventajas / razones para usar ay Handler
no a Thread
?
PD. - Por el bien de esta pregunta, ignoremos AsyncTask
. - El Handler().postDelayed
caso de uso está claro para mí, por el bien de esta pregunta, supongamos que necesito que la tarea comience de inmediato.
Respuestas:
Si lo que está haciendo es "pesado", debería hacerlo en un hilo. Si no lo inicia explícitamente en su propio subproceso, se ejecutará en el subproceso principal (UI) que puede ser notorio como nervioso o lento para responder a la interfaz de sus usuarios.
Curiosamente, cuando está utilizando un hilo, a menudo es útil usar también un controlador como medio de comunicación entre el hilo de trabajo que está iniciando y el hilo principal.
Una interacción típica de Thread / Handler podría verse así:
Sin embargo, en general, la conclusión es que debe usar un subproceso cada vez que realice un trabajo que podría ser de larga duración o muy intenso (es decir, cualquier red, archivo IO, aritmética pesada, etc.).
fuente
updateUI()
se ejecutará despuésonCreateView
(después de cargar nuevas vistas)?message.what()
? ¿No sería asíif(msg == 0){
? ¡Muchas gracias! :)Handler y Thread son realmente 2 cosas diferentes.
Se debe crear un hilo para ejecutar trabajos de larga ejecución.
Un controlador es un objeto muy conveniente para comunicarse entre 2 subprocesos (por ejemplo: un subproceso en segundo plano necesita actualizar la interfaz de usuario. Puede usar un controlador para publicar algunos Runnable de su subproceso en segundo plano en el subproceso de la interfaz de usuario).
Por lo tanto, no puede elegir entre Handler o Thread. ¡Usa un hilo para hacer trabajos pesados! (puede usar un controlador si su subproceso en segundo plano activará algún trabajo en otro subproceso, la mayoría de las veces el subproceso de la interfaz de usuario)
fuente
Handler
yThread
son dos cosas diferentes, pero no se contradicen entre sí. Puede tener aHandler
yThread
a al mismo tiempo y en realidad cada unoHandler
debe ejecutarse en aThread
.Para más detalles, puede consultar este artículo .
fuente
A se
Handler
ejecuta en el mismoThread
, a seThread
ejecuta en un hilo diferente.Use un controlador si necesita ejecutar algo en el mismo hilo , generalmente un elemento GUI o algo así.
Use un hilo si desea mantener el hilo principal libre para hacer otras cosas . Use esto para cualquier cosa que tome una cantidad significativa de tiempo.
fuente
Los controladores son la mejor forma de comunicación entre el fondo y el hilo de la interfaz de usuario. En general, los controladores están asociados con la cola de mensajes de un subproceso y se utilizan para enviar mensajes y pueden ejecutarse en el mensaje.
UTILIZAR:
Subproceso: para realizar tareas en subproceso saperate (fondo) que subproceso de interfaz de usuario. (ayuda a desbloquear el hilo de la interfaz de usuario)
Controlador Se utiliza para comunicarse entre la interfaz de usuario y el subproceso en segundo plano.
Echa un vistazo a este artículo
fuente
... más información aquí sobre subprocesos, etc. (incluye turnos para los diferentes mecanismos de subprocesamiento y sincronización y cuándo usar qué)
fuente
Un controlador le permite enviar y procesar mensajes y
Runnable
objetos asociados con un hiloMessageQueue
. CadaHandler
instancia está asociada con un solo hilo y la cola de mensajes de ese hilo.Cuando creas un nuevo
Handler
, está vinculado a la cola de hilo / mensaje del hilo que lo está creando; a partir de ese momento, enviará mensajes y ejecutables a esa cola de mensajes y los ejecutará a medida que salgan de la cola de mensajes. .Hay dos usos principales para un controlador:
Si usa hilos Java, debe manejar algunas cosas por su cuenta: sincronizar con el hilo principal, cancelar un hilo, etc.
Este subproceso único no crea un grupo de subprocesos a menos que use
ThreadPoolExecutor
oExecutorService
API.(Tomó esta consulta de sus comentarios sobre la respuesta de Blackbelt)
Referencia: artículo sobre rendimiento de subprocesos
Hay ciertos tipos de trabajo que pueden reducirse a tareas altamente paralelas y distribuidas. Con el gran volumen de paquetes de trabajo que esto crea,
AsyncTask
yHandlerThread
no son clases apropiadas. La naturaleza de un solo subprocesoAsyncTask
convertiría todo el trabajo combinado en un sistema lineal. El uso de laHandlerThread
clase, por otro lado, requeriría que el programador gestione manualmente el equilibrio de carga entre un grupo de subprocesos.ThreadPoolExecutor es una clase auxiliar para facilitar este proceso. Esta clase gestiona la creación de un grupo de subprocesos, establece sus prioridades y gestiona cómo se distribuye el trabajo entre esos subprocesos. A medida que la carga de trabajo aumenta o disminuye, la clase gira o destruye más hilos para ajustarse a la carga de trabajo.
Puede consultar este artículo de la guía del desarrollador en create-threadpool para obtener más detalles.
Eche un vistazo a esta publicación para
Handler
usarla para ejecutar varias instancias Runnable. En este caso, todas lasRunnable
tareas se ejecutarán en un solo subproceso.Android: tostadas en un hilo
fuente
Handler
se puede usar junto conThread
para crear un mecanismo en cola. Puedes usar elhandler
para publicar algo en elThread
Looper
fuente