runOnUiThread vs Looper.getMainLooper (). post dans Android

99

Quelqu'un peut-il me dire s'il y a une différence entre utiliser runOnUiThread () et Looper.getMainLooper (). Post () pour exécuter une tâche sur le thread d'interface utilisateur sous Android ??

À propos de la seule chose que je peux déterminer, c'est que puisque runOnUiThread est une méthode d'activité non statique, Looper.getMainLooper (). Post () est plus pratique lorsque vous devez coder quelque chose dans une classe qui ne peut pas voir l'activité (comme une interface).

Je ne cherche pas une discussion sur la question de savoir si quelque chose doit être exécuté sur le thread de l'interface utilisateur, je comprends que certaines choses ne peuvent pas et beaucoup de choses ne devraient pas, mais certaines choses (comme le démarrage d'une AsyncTask) DOIVENT être exécutées à partir de le fil de l'interface utilisateur.

Merci,
R.

Riches
la source
6
Il n'y a aucune différence sauf que runOnUiThreadvérifiera si c'est déjà le fil de l'interface utilisateur et exécutera votre tâche directement au lieu de la publier comme unMessage
zapl
1
Merci. Pourriez-vous s'il vous plaît convertir cela en une réponse, afin que je puisse l'accepter?
Riche
De plus, j'ai déjà écrit du code pour vérifier si quelque chose est en cours d'exécution sur le thread de l'interface utilisateur, ce qui serait très simple à inclure manuellement.
Riche

Réponses:

192

Les éléments suivants se comportent de la même manière lorsqu'ils sont appelés à partir de threads d'arrière-plan:

  • en utilisant Looper.getMainLooper()

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

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

La seule différence est lorsque vous faites cela à partir du thread de l'interface utilisateur depuis

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

vérifiera si le thread actuel est déjà le thread d'interface utilisateur, puis l'exécutera directement. Le publier sous forme de message retardera l'exécution jusqu'à ce que vous reveniez de la méthode de thread d'interface utilisateur actuelle.

Il existe également une troisième façon d'exécuter un Runnablesur le thread d'interface utilisateur qui serait View#post(Runnable)- celui-ci publiera toujours le message même lorsqu'il est appelé depuis le thread d'interface utilisateur. C'est utile car cela garantira que le Viewa été correctement construit et a une mise en page avant que le code ne soit exécuté.

zapl
la source