Jaka jest różnica między Activity.runOnUiThreadi View.post, czy ktoś mógłby wyjaśnić?
Jaka jest różnica między Activity.runOnUiThreadi View.post, czy ktoś mógłby wyjaśnić?
Odpowiedzi:
Nie ma żadnej różnicy, poza tym, że View.postjest pomocny, gdy nie masz bezpośredniego dostępu do działania.
W obu przypadkach, jeśli nie w wątku UI, Handler#post(Runnable)zostanie wywołany za kulisami.
Jak wspomniano CommonsWare w komentarzach, nie ma różnicy między nimi - w przypadku ich wywoływania Ui nici Activity#runOnUiThreadwywoła runsposób bezpośrednio, podczas gdy View#postumieści runnablesię w kolejce (np wywołać Handler#post)
Ważną kwestią IMO jest to, że oba mają ten sam cel, a dla każdego, kto go używa, nie powinno być żadnej różnicy (a implementacja może się zmienić w przyszłości).
runOnUiThread()sprawdza bieżący wątek i Runnablenatychmiast wykonuje, jeśli znajdujemy się w głównym wątku aplikacji. post()zawsze umieszcza Runnablekolejkę w kolejce, bez względu na to, w jakim wątku jest wywoływana.
runOnUiThread()sprawdza bieżący wątek i Runnablenatychmiast wykonuje, jeśli znajdujemy się w głównym wątku aplikacji ” (podkreślenie dodane). „Czy to oznacza, że to, co aktualnie znajduje się w wątku interfejsu użytkownika, jest ignorowane i ma to najwyższy priorytet?” - „cokolwiek jest obecnie na wątku UI” jestrunOnUiThread() wezwanie.
Inną różnicą między Activity.runOnUiThread i view.post () jest to, że funkcja runnable in view.post () jest wywoływana po dołączeniu widoku do okna.
Każda z nich jest akceptowalna w większości sytuacji i w większości są wymienne, ale są nieco inne. Największą różnicą jest oczywiście to, że jeden jest dostępny z pliku Activitya, a drugi z pliku View. Są one w dużym stopniu nakładane, ale czasami w a Activitynie będziesz mieć dostępu do a View, a czasami w a Viewnie będziesz mieć dostępu do Activity.
Jeden z skrajnych przypadków, z którymi się spotkałem View.post, wspomniałem w odpowiedzi na inne pytanie SO dotycząceView.post : View.postdziała tylko z innego wątku, gdy Viewjest dołączony do okna. Jest to rzadko są problemem, ale może czasami spowodować Runnable, aby nigdy nie wykonać, zwłaszcza jeśli nazwać View.postw onCreatesposób dokonania Activity. Alternatywą jest użycie tego, Handler.postco jest Activity.runOnUiThreadi View.postużywanie i tak pod osłonami.
(poprawiono dokładność, dodano „z innego wątku”)
onCreate()? Hm, spodziewałbym się, że w takim przypadku wyślę go do Handlerdostarczonego przez ViewRoot.
View.postpowinienem dodać Runnabledo kolejki do wykonania później, jeśli nie jest jeszcze dołączony. Nie kopałem głębiej w źródle, ale dokumentacja mówi: „Ta metoda może być wywołana spoza wątku interfejsu użytkownika tylko wtedy, gdy ten widok jest dołączony do okna”. Więc myślę, że jeśli jest w bieżącym wątku, to to, co powiedziałeś, jest prawdą, jeśli nie, to prawdopodobnie po prostu połyka Runnable. Z pewnością miałem to w moim kodzie.