¿Qué es el UiThread de Android (hilo de interfaz de usuario)?

81

¿Alguien puede explicarme qué es exactamente el hilo de la interfaz de usuario? En developer.android.com dice sobre la función runOnUiThread

public final void runOnUiThread (acción ejecutable)

Desde: API Nivel 1 Ejecuta la acción especificada en el subproceso de la interfaz de usuario. Si el hilo actual es el hilo de la interfaz de usuario, la acción se ejecuta inmediatamente. Si el hilo actual no es el hilo de la IU, la acción se publica en la cola de eventos del hilo de la IU.

¿Significa el hilo de la interfaz de usuario que esto se ejecutará cada vez que la actividad pase al fondo por alguna actividad de la interfaz de usuario como una llamada entrante o atenuación de pantalla, etc. Si no es así, ¿qué incluye exactamente el hilo de la interfaz de usuario?

Gracias

user434885
fuente

Respuestas:

143

UIThread es el hilo principal de ejecución de su aplicación. Aquí es donde se ejecuta la mayor parte del código de su aplicación. Todos los componentes de su aplicación (Actividades, Servicios, ContentProviders, BroadcastReceivers) se crean en este hilo, y cualquier llamada del sistema a esos componentes se realiza en este hilo.

Por ejemplo, digamos que su aplicación es una sola clase de actividad. Luego, todos los métodos del ciclo de vida y la mayor parte del código de manejo de eventos se ejecutan en este UIThread. Estos son métodos como onCreate, onPause, onDestroy, onClick, etc. Además, aquí es donde todos los cambios a la interfaz de usuario están hechos. Cualquier cosa que haga que la IU se actualice o cambie TIENE que suceder en el hilo de la IU.

Para obtener más información sobre los procesos y subprocesos de su aplicación, haga clic aquí.

Cuando generas explícitamente un nuevo hilo para trabajar en segundo plano, este código no se ejecuta en UIThread. Entonces, ¿qué sucede si este hilo en segundo plano necesita hacer algo que cambie la interfaz de usuario? Para esto es runOnUiThread. En realidad, se supone que debe usar un controlador (consulte el enlace a continuación para obtener más información sobre esto). Proporciona a estos subprocesos de fondo la capacidad de ejecutar código que puede modificar la interfaz de usuario. Lo hacen colocando el código de modificación de la interfaz de usuario en un objeto Runnable y pasándolo al método runOnUiThread.

Para obtener más información sobre cómo generar hilos de trabajo y actualizar la interfaz de usuario desde ellos, haga clic aquí

Yo personalmente solo uso el runOnUiThreadmétodo en mis Pruebas de Instrumentación. Dado que el código de prueba no se ejecuta en UIThread, debe utilizar este método para ejecutar código que modifica la interfaz de usuario. Entonces, lo uso para inyectar clics y eventos clave en mi aplicación. Luego puedo verificar el estado de la aplicación para asegurarme de que sucedieron las cosas correctas.

Para obtener más información sobre cómo probar y ejecutar código en UIThread, haga clic aquí

plainjimbo
fuente
3
Gran explicación, especialmente para los fundamentos de aplicaciones de enlace es una lectura obligada para todos los principiantes como yo :)
Java Estudiante
1
¿No deberías usar un en AsyncTasklugar de runOnUiThreaden la mayoría de los casos?
JDJ
5
@JDJ las 2 técnicas tienen diferentes propósitos: lo AsyncTasksacarán del hilo principal, al fondo; runOnUiThread()lo llevará al hilo principal, desde el fondo. Entonces, depende de lo que estés tratando de lograr.
Richard Le Mesurier
10

Si ejecuta código de bloqueo (por ejemplo, una solicitud Http) en un hilo separado, considere usar AsyncTask . Su doInBackground-Método se ejecuta en un hilo separado. AsyncTaskle proporciona métodos onProgressUpdatey onPostExecuteque están garantizados para ejecutarse en el hilo de la IU .

Si necesita actualizaciones de progreso de GUI (por ejemplo, a través de una barra de progreso) llame publishProgressadentro doInBackground. Esto conduce a una llamada posterior onPublishProgressque también se garantiza que se ejecutará en el hilo de la interfaz de usuario .

onPostExecutese llama automáticamente después de las doInBackgrounddevoluciones.

Martin Pabst
fuente
4

Todos los dibujos de la interfaz de usuario, etc., ocurren en un hilo separado. Se llama UIThread. Si desea realizar algún cambio en la interfaz de usuario, debe usar asegúrese de que suceda en el contexto de UIThread. La forma más sencilla de hacerlo es utilizarrunOnUiThread

the100rabh
fuente
¿Puede preparar estructuras de datos de widgets (como inflar un diseño) en un hilo que no sea UI y luego dibujarlas más tarde en un hilo UI?
SMBiggs
Nunca intenté eso, pero técnicamente debería ser posible, ya que inflar solo crea la estructura de datos. Es la parte en la que se adjunta es a una actividad, etc. es cuando necesita hacerlo en un contexto de UIThread.
the100rabh