runOnUiThread vs Looper.getMainLooper (). post dans Android

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 dans Android?

La seule chose que je puisse déterminer est que, puisque runOnUiThread est une méthode Activity non statique, Looper.getMainLooper (). Post () est plus pratique lorsque vous devez coder quelque chose dans une classe qui ne peut pas voir l’activité (par exemple: une interface).

Je ne cherche pas une discussion sur si quelque chose devrait être exécuté sur le thread d’interface utilisateur, je comprends que certaines choses ne peuvent pas et qu’un grand nombre de choses ne devraient pas, mais certaines choses (comme démarrer une AsyncTask) DOIVENT être exécutées de le fil de l’interface utilisateur.

Merci,
R.

Le comportement suivant est le même lorsqu’il est appelé depuis des threads d’arrière-plan

via Looper.getMainLooper()

  Runnable task = getTask(); new Handler(Looper.getMainLooper()).post(task); 

via Activity#runOnUiThread()

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

La seule différence est lorsque vous faites cela à partir du thread d’interface utilisateur depuis

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

vérifiera si le thread en cours est déjà le thread d’interface utilisateur, puis exécutez-le directement. La publier en tant que message retardera l’exécution jusqu’à ce que vous reveniez de la méthode actuelle de l’interface utilisateur.

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 s’il est appelé depuis le thread d’interface utilisateur. Cela est utile car cela garantira que la View a été correctement construite et possède une mise en page avant que le code ne soit exécuté.