runOnUiThread vs Looper.getMainLooper (). post no Android

99

Alguém pode me dizer se há alguma diferença entre usar runOnUiThread () e Looper.getMainLooper (). Post () para executar uma tarefa no thread de IU no Android?

Praticamente a única coisa que posso determinar é que, uma vez que runOnUiThread é um método Activity não estático, Looper.getMainLooper (). Post () é mais conveniente quando você precisa codificar algo em uma classe que não pode ver a Activity (como uma interface).

Não estou procurando uma discussão sobre SE algo deve ser executado no thread de interface do usuário, percebi que algumas coisas não podem e muitas coisas não deveriam, no entanto, algumas coisas (como iniciar uma AsyncTask) DEVEM ser executadas a partir de o thread da IU.

Obrigado
R.

Rico
fonte
6
Não há diferença, exceto que runOnUiThreadirá verificar se já é o thread de interface do usuário e executar sua tarefa diretamente em vez de postá-la como umMessage
zapl
1
Obrigado. Você poderia converter isso em uma resposta, para que eu possa aceitá-la ??
Rico de
Além disso, já escrevi algum código para verificar se algo está sendo executado no thread de interface do usuário, então seria muito simples incluir manualmente.
Rico de

Respostas:

192

O seguinte se comporta da mesma forma quando chamado de threads de fundo:

  • usando Looper.getMainLooper()

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

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

A única diferença é quando você faz isso a partir do thread da IU, já que

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

irá verificar se o Thread atual já é o thread da interface do usuário e executá-lo diretamente. Postá-lo como uma mensagem atrasará a execução até que você retorne do método de thread de interface do usuário atual.

Há também uma terceira maneira de executar um Runnableno thread de UI que seria View#post(Runnable)- esta sempre postará a mensagem, mesmo quando chamada a partir do thread de UI. Isso é útil, pois garante que o Viewfoi construído corretamente e tem um layout antes de o código ser executado.

zapl
fonte