runOnUiThread vs Looper.getMainLooper (). post w systemie Android

99

Czy ktoś może mi powiedzieć, czy jest jakaś różnica między użyciem runOnUiThread () a Looper.getMainLooper (). Post () do wykonania zadania w wątku interfejsu użytkownika w systemie Android?

Jedyne, co mogę ustalić, to to, że skoro runOnUiThread jest niestatyczną metodą działania, Looper.getMainLooper (). Post () jest wygodniejszy, gdy trzeba zakodować coś w klasie, która nie widzi działania (na przykład interfejs).

Nie szukam dyskusji na temat CZY coś powinno zostać wykonane w wątku UI, rozumiem, że niektóre rzeczy nie mogą, a bardzo wiele nie powinno, jednak niektóre rzeczy (takie jak uruchomienie AsyncTask) MUSZĄ być wykonane z wątek interfejsu użytkownika.

Dzięki,
R.

Bogaty
źródło
6
Nie ma żadnej różnicy poza tym, runOnUiThreadże sprawdzi, czy jest to już wątek interfejsu użytkownika i wykona zadanie bezpośrednio zamiast wysyłania go jakoMessage
zapl
1
Dzięki. Czy mógłbyś zamienić to na odpowiedź, abym mógł to zaakceptować?
Rich
Ponadto napisałem już kod, aby sprawdzić, czy coś jest wykonywane w wątku UI, więc byłoby to bardzo proste do ręcznego dołączenia.
Rich

Odpowiedzi:

192

Poniższe zachowuje się tak samo, gdy są wywoływane z wątków w tle:

  • za pomocą Looper.getMainLooper()

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

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

Jedyną różnicą jest to, że od tego czasu robisz to z wątku interfejsu użytkownika

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

sprawdzi, czy bieżący wątek jest już wątkiem interfejsu użytkownika, a następnie wykona go bezpośrednio. Opublikowanie go jako wiadomości opóźni wykonanie do czasu powrotu z bieżącej metody wątku interfejsu użytkownika.

Istnieje również trzeci sposób wykonania Runnablew wątku interfejsu użytkownika, który byłby View#post(Runnable)- ten zawsze będzie publikował wiadomość, nawet gdy zostanie wywołana z wątku interfejsu użytkownika. Jest to przydatne, ponieważ zapewni to, że Viewplik został poprawnie skonstruowany i ma układ przed wykonaniem kodu.

zapl
źródło