studio - runOnUiThread vs Looper.getMainLooper(). publicación en Android
interfaz de usuario de android (1)
¿Alguien puede decirme si hay alguna diferencia entre usar runOnUiThread () versus Looper.getMainLooper (). Post () para ejecutar una tarea en el hilo de UI en Android?
Lo único que puedo determinar es que, dado que runOnUiThread es un método de Actividad no estático, Looper.getMainLooper (). Post () es más conveniente cuando necesitas codificar algo en una clase que no puede ver la Actividad (como una interfaz).
No busco una discusión sobre si algo debe ejecutarse en el hilo de la interfaz de usuario, entiendo que algunas cosas no pueden y muchas cosas no deberían, sin embargo, algunas cosas (como iniciar una AsyncTask) DEBEN ejecutarse desde el hilo de la interfaz de usuario
Gracias,
R.
Lo siguiente se comporta igual cuando se llama desde hilos de fondo
a través de Looper.getMainLooper()
Runnable task = getTask();
new Handler(Looper.getMainLooper()).post(task);
a través de Activity#runOnUiThread()
Runnable task = getTask();
runOnUiThread(task);
La única diferencia es cuando haces eso desde el hilo de la interfaz de usuario desde
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
verificará si el hilo actual ya es el hilo de la interfaz de usuario y luego lo ejecutará directamente. Publicarlo como mensaje retrasará la ejecución hasta que regrese del método actual de subprocesos de UI.
También hay una tercera forma de ejecutar Runnable
en el subproceso de UI que sería View#post(Runnable)
: este siempre publicará el mensaje incluso cuando se llame desde el subproceso de UI. Eso es útil, ya que eso garantizará que la View
se haya construido correctamente y tenga un diseño antes de que se ejecute el código.