¿Qué es Android UiThread (hilo de interfaz de usuario)?
¿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
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
. onClick
Cualquier 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 runOnUiThread
mé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í
Si ejecuta código de bloqueo (por ejemplo, una solicitud Http) en un subproceso separado, considere usar AsyncTask . Su doInBackground
método se ejecuta en un hilo separado. AsyncTask
le proporciona métodos onProgressUpdate
y onPostExecute
se 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 publishProgress
al interior doInBackground
. Esto conduce a una llamada posterior que onPublishProgress
también se garantiza que se ejecutará en el subproceso de la interfaz de usuario .
onPostExecute
se llama automáticamente después de doInBackground
las devoluciones.
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