thread runonuithread method cannot activity android

android - method - ¿Cuál es la diferencia entre Activity.runOnUiThread(acción ejecutable) y Handler.post()?



runonuithread xamarin (2)

Activity.runOnUiThread, como su nombre lo indica, ejecutará el Runnable en el hilo que actualmente es responsable de la interfaz de usuario. Por lo tanto, si tiene una tarea de uso intensivo de la CPU, puede hacer que la IU no responda por un corto período de tiempo. A la inversa, Handler proporciona una manera de crear un subproceso, ejecutar un código y notificar a la UI cuando haya terminado (es decir, Handler.sendMessage).

Los documentos para Handler lo dicen mejor que yo:

Cuando se crea un proceso para su aplicación, su hilo principal está dedicado a ejecutar una cola de mensajes que se encarga de administrar los objetos de la aplicación de nivel superior (actividades, receptores de difusión, etc.) y cualquier ventana que creen. Puede crear sus propios hilos y comunicarse con el hilo principal de la aplicación a través de un Manejador. Esto se hace llamando a los mismos métodos de publicación o envío de mensaje como antes, pero desde su nuevo hilo. El Runnable o el Mensaje dado se programará en la cola de mensajes del Controlador y se procesará cuando sea apropiado.

¿Cuáles son las diferencias / ventajas / inconvenientes entre el uso de Activity.runOnUiThread o Handler.post(runnable action) en Android?


Activity.runOnUiThread() es un caso especial de manejadores más genéricos. Con Handler puedes crear tu propia consulta de evento dentro de tu propio hilo. El uso de Handlers instanciados con el constructor predeterminado no significa que "el código se ejecutará en el hilo de la IU" en general. De forma predeterminada, los controladores se enlazaron a Thread desde el cual se crearon instancias. Para crear un controlador que está garantizado para vincularse con el hilo de la interfaz de usuario (principal), debe crear un objeto Handler enlazado a Main Looper de la siguiente manera:

Handler mHandler = new Handler(Looper.getMainLooper());

Además, si verificas la implementación del método runOnuiThread() , está usando Handler para hacer las cosas:

public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } }

Como puede ver en el fragmento de código anterior, la acción Ejecutable se ejecutará inmediatamente, si se llama a runOnUiThread() desde el subproceso de la interfaz de usuario. De lo contrario, lo publicará en el controlador, que se ejecutará en algún momento posterior.