2012-12-20 10 views
75

Czy ktoś może mi powiedzieć, czy jest jakaś różnica między używaniem runOnUiThread() a Looper.getMainLooper(). Post(), aby wykonać zadanie w wątku UI w systemie Android?runOnUiThread vs Looper.getMainLooper(). Post w Androidzie

Jedyne, co mogę stwierdzić, to to, że ponieważ runOnUiThread jest niestatyczną metodą działania, Looper.getMainLooper(). Post() jest wygodniejszy, gdy trzeba coś zakodować w klasie, która nie widzi Aktywność (taka jak interfejs).

Nie szukam dyskusji na temat tego, CZY coś powinno być wykonane na wątku UI, dostaję, że niektóre rzeczy nie mogą i wiele rzeczy nie powinno, jednak niektóre rzeczy (jak uruchomienie AsyncTask) MUSI być wykonany z wątku interfejsu użytkownika.

Dzięki,
R.

+4

Nie ma żadnej różnicy, z wyjątkiem tego, że 'runOnUiThread' sprawdzi, czy jest już wątkiem interfejsu użytkownika i wykona zadanie bezpośrednio, zamiast opublikować je jako" Wiadomość " – zapl

+1

Dzięki. Czy mógłbyś przekonwertować to na odpowiedź, więc mogę to zaakceptować? – Rich

+0

Ponadto, napisałem już kod, aby sprawdzić, czy coś jest wykonywane w wątku UI, więc byłoby to bardzo łatwe do ręcznego włączenia. – Rich

Odpowiedz

149

Poniższy zachowuje się tak samo, gdy wywołana z wątków tła

poprzez Looper.getMainLooper()

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

poprzez Activity#runOnUiThread()

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

Jedynym dif Ferenc jest, kiedy to zrobić z wątku UI od

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ątek UI, a następnie uruchomić go bezpośrednio. Publikowanie go jako wiadomości opóźni wykonanie, dopóki nie powrócisz z bieżącej metody wątku interfejsu użytkownika.

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

+2

Świetna odpowiedź, dzięki! – Boy