studio scanner para libreria how example devices connectedthread android

android - scanner - Handler vs AsyncTask



listview bluetooth android example (8)

El controlador está asociado con el hilo principal de la aplicación. maneja y programa mensajes y ejecutables enviados desde hilos de fondo al hilo principal de la aplicación.

AsyncTask proporciona un método simple para manejar subprocesos de fondo con el fin de actualizar la interfaz de usuario sin bloquearlo por las operaciones que consumen tiempo.

La respuesta es que ambos se pueden usar para actualizar la interfaz de usuario desde los hilos de fondo, la diferencia estaría en su escenario de ejecución. Puede considerar el uso del controlador si desea publicar mensajes retrasados ​​o enviar mensajes a MessageQueue en un orden específico.

Puede considerar el uso de AsyncTask si desea intercambiar parámetros (actualizando la IU) entre el hilo principal de la aplicación y el hilo de fondo de una manera fácil y conveniente.

Estoy confundido en cuanto a cuándo elegiría AsyncTask sobre un controlador. Digamos que tengo un código que quiero ejecutar cada n segundos, lo que actualizará la UI. ¿Por qué elegiría uno sobre el otro?


Mi regla de oro sería:

  • Si está haciendo algo aislado relacionado con la IU, por ejemplo descargando datos para presentarlos en una lista, siga adelante y use AsyncTask .

  • Si realiza varias tareas repetidas, por ejemplo descargando varias imágenes que se mostrarán en ImageViews (como la descarga de miniaturas) tras la descarga, use una cola de tareas con Handler .


Si desea hacer un cálculo cada x segundos, probablemente deba programar un Runnable en un Handler (con postDelayed() ) y Runnable debería comenzar en el subproceso actual de UI. Si desea iniciarlo en otro hilo, use HandlerThread. AsyncTask es más fácil de usar para nosotros pero no mejor que el controlador.


Siempre trate de evitar el uso de AsyncTask cuando sea posible principalmente por las siguientes razones:

  • No se garantiza que AsyncTask se ejecute, ya que hay una base de ThreadPool y un tamaño máximo establecidos por el sistema, y ​​si creas demasiadas tareas asynctask, finalmente se destruirán.

  • AsyncTask puede finalizar automáticamente, incluso cuando se ejecuta, dependiendo del ciclo de vida de la actividad y usted no tiene control sobre él

  • Los métodos AsyncTask que se ejecutan en el subproceso UI, como onPostExecute, se pueden ejecutar cuando la actividad a la que hace referencia ya no es visible o posiblemente en un estado de disposición diferente, como después de un cambio de orientación.

En conclusión, no deberías usar los métodos UIThread-linked de AsyncTask, ¡¡¡lo cual es su principal ventaja !!! Además, solo deberías hacer un trabajo no crítico en doInBackground. Lea este hilo para obtener más información sobre este problema:

¿Realmente es AsyncTask conceptualmente defectuoso o me falta algo?

Para concluir trate de preferir el uso de IntentServices, HandlerThread o ThreadPoolExecutor en lugar de AsyncTask cuando cualquiera de los problemas mencionados anteriormente sea una preocupación para usted. Claro que requerirá más trabajo, pero su aplicación será más segura.


Son la mejor pregunta de la entrevista que se hace. AsyncTask : se utilizan para descargar el subproceso de interfaz de usuario y realizar tareas en segundo plano. Controladores: dosent de Android tienen una forma directa de comunicación entre la interfaz de usuario y el hilo de fondo. Los manejadores deben usarse para enviar mensajes o ejecutables a través de la cola de mensajes.

Por lo tanto, AsyncTasks se utiliza cuando se necesitan tareas para ejecutarse en segundo plano y Handlers se utilizan para la comunicación entre una interfaz de usuario y el subproceso de fondo.


AsyncTask supone que harás algo en el hilo de la interfaz de usuario, después de que se termine el trabajo de fondo. Además, puede ejecutarlo solo una vez (después de esto, su estado es FINISHED y obtendrá una excepción tratando de ejecutarlo una vez más). Además, la flexibilidad de usarlo no es mucho. Sí, puedes usar THREAD_POOL_EXECUTOR para una ejecución paralela, pero el esfuerzo podría no ser digno.

Handler no supone nada, excepto manejar Elementos ejecutables y Mensajes. Además, se puede ejecutar tantas veces como lo desee . Usted es libre de decidir a qué hilo se debe adjuntar, cómo se comunica con otros controladores, tal vez producirlos con HandlerThread . Por lo tanto, es mucho más flexible y adecuado para algunos trabajos repetidos.

Consulte diferentes tipos de ejemplos de Handler here .


doInBackground - básicamente funciona en otro hilo. onPostExecute : publica los resultados en el subproceso de la interfaz de usuario y internamente está enviando el mensaje al controlador del hilo principal. La hebra de IU principal ya tiene un looper y controlador asociado.

Entonces, básicamente, si tiene que hacer alguna tarea en segundo plano, use AsyncTask. Pero, en última instancia, si algo necesita actualizarse en la interfaz de usuario, usará el controlador del hilo principal.


IMO, AsyncTask fue escrito para proporcionar una forma conveniente y fácil de usar para lograr el procesamiento de fondo en las aplicaciones de Android, sin preocuparse demasiado por los detalles de bajo nivel (hilos, bucles de mensajes, etc.). Proporciona métodos de devolución de llamada que ayudan a programar tareas y también a actualizar fácilmente la interfaz de usuario cuando sea necesario.

Sin embargo, es importante tener en cuenta que al usar AsyncTask, un desarrollador se somete a sus limitaciones, lo que se debe a las decisiones de diseño que tomó el autor de la clase. Por ejemplo, recientemente descubrí que hay un límite en la cantidad de trabajos que se pueden programar usando AsyncTasks.

Handler es más transparente de los dos y probablemente te dé más libertad; así que si quieres tener más control sobre las cosas, deberás elegir Handler o, de lo contrario, AsynTask funcionará bien.