web-dev-qa-db-fra.com

runOnUiThread vs Looper.getMainLooper (). publier dans Android

Quelqu'un peut-il me dire s'il existe une différence entre l'utilisation de runOnUiThread () et celle de Looper.getMainLooper (). Post () pour exécuter une tâche sur le fil de l'interface utilisateur sous Android?

La seule chose que je puisse déterminer 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 à discuter de la question de savoir si quelque chose doit être exécuté sur le fil de l'interface utilisateur. Je comprends que certaines choses ne peuvent pas et beaucoup de choses ne devraient pas, mais certaines choses (comme démarrer une AsyncTask) DOIVENT être exécutées à partir de le fil de l'interface utilisateur.

Merci,
R.

91
Rich

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 que vous le faites depuis le fil 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. L'envoyer en tant que message retardera l'exécution jusqu'à ce que vous reveniez de la méthode de thread d'interface utilisateur actuelle.

Il y a aussi une troisième façon d'exécuter un Runnable sur le thread d'interface utilisateur qui serait View#post(Runnable) - celui-ci publiera toujours le message même lorsqu'il est appelé depuis l'interface utilisateur fil. Cela est utile car cela permettra de s'assurer que View a été correctement construit et dispose d'une présentation avant que le code ne soit exécuté.

179
zapl