runOnUiThread vs Looper.getMainLooper (). publicar en Android

99

¿Alguien puede decirme si hay alguna diferencia entre usar runOnUiThread () versus Looper.getMainLooper (). Post () para ejecutar una tarea en el hilo de la interfaz de usuario en Android?

Casi 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 necesita codificar algo en una clase que no puede ver la actividad (como una interfaz).

No estoy buscando una discusión sobre SI algo debería 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.

Rico
fuente
6
No hay diferencia, excepto que runOnUiThreadverificará si ya es el hilo de la interfaz de usuario y ejecutará su tarea directamente en lugar de publicarla comoMessage
zapl
1
Gracias. ¿Podrías convertir eso en una respuesta para que pueda aceptarla?
Rich
Además, ya escribí un código para verificar si se está ejecutando algo en el hilo de la interfaz de usuario, por lo que sería muy simple incluirlo manualmente.
Rich

Respuestas:

192

Lo siguiente se comporta igual cuando se llama desde subprocesos en segundo plano:

  • utilizando Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
  • utilizando Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);

La única diferencia es cuando haces eso desde el hilo de la interfaz de usuario, ya que

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

comprobará si el hilo actual ya es el hilo de la interfaz de usuario y luego lo ejecutará directamente. Publicarlo como un mensaje retrasará la ejecución hasta que regrese del método actual de UI-thread.

También hay una tercera forma de ejecutar un Runnableen el hilo de la interfaz de usuario, que sería View#post(Runnable): esta siempre publicará el mensaje incluso cuando se llame desde el hilo de la interfaz de usuario. Eso es útil ya que asegurará que Viewse haya construido correctamente y tenga un diseño antes de que se ejecute el código.

zapl
fuente