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

Resuelto user434885 asked hace 54 años • 3 respuestas

¿Alguien puede explicarme qué es exactamente el hilo de la interfaz de usuario? En desarrollador.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 interfaz de usuario, la acción se publica en la cola de eventos del hilo de la interfaz de usuario.

¿El hilo de la interfaz de usuario significa que esto se ejecutará cada vez que la actividad pase a segundo plano por alguna actividad de la interfaz de usuario, como una llamada entrante o la atenuación de la pantalla, etc.? Si no, ¿qué incluye exactamente el hilo de la interfaz de usuario?

Gracias

user434885 avatar Jan 01 '70 08:01 user434885
Aceptado

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 única 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, , etc. Además, aquí es donde se realizan todas las actualizaciones de la interfaz de usuario onDestroy. onClickCualquier cosa que haga que la interfaz de usuario se actualice o cambie TIENE que suceder en el hilo de la interfaz de usuario.

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

Cuando genera 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 debes usar un controlador (consulte el enlace a continuación para obtener más información sobre esto). Proporciona a estos subprocesos en segundo plano la capacidad de ejecutar código que puede modificar la interfaz de usuario. Para ello, colocan el código de modificación de la interfaz de usuario en un objeto Runnable y lo pasan al método runOnUiThread.

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

Yo personalmente sólo 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 modifique la interfaz de usuario. Entonces, lo uso para inyectar eventos clave y de clic 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 avatar Sep 06 '2010 18:09 plainjimbo

Si ejecuta código de bloqueo (por ejemplo, una solicitud Http) en un subproceso separado, considere usar AsyncTask . Su doInBackgroundmétodo se ejecuta en un hilo separado. AsyncTaskle proporciona métodos onProgressUpdatey onPostExecutese garantiza que se ejecutarán en el subproceso de la interfaz de usuario .

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

onPostExecutese llama automáticamente después de doInBackgroundlas devoluciones.

Martin Pabst avatar Feb 05 '2014 13:02 Martin Pabst

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 utilizarlo y asegurarse de que suceda en el contexto de UIThread. La forma más sencilla de hacerlo es utilizarrunOnUiThread

the100rabh avatar Sep 06 '2010 15:09 the100rabh