UIThread to główny wątek wykonywania aplikacji. W tym miejscu uruchamiana jest większość kodu aplikacji. Wszystkie składniki aplikacji (działania, usługi, dostawcy treści, odbiorniki transmisji) są tworzone w tym wątku, a wszelkie wywołania systemowe do tych składników są wykonywane w tym wątku.
Na przykład, powiedzmy, że Twoja aplikacja jest pojedynczą klasą Activity. Następnie wszystkie metody cyklu życia i większość kodu obsługi zdarzeń jest uruchamiana w tym UIThread. Są to metody, takie jak onCreate
, onPause
, onDestroy
, onClick
, itd. Ponadto, jest to miejsce gdzie wszystkie aktualizacje do interfejsu użytkownika są wykonane. Wszystko, co powoduje aktualizację lub zmianę interfejsu użytkownika, MUSI wydarzyć się w wątku interfejsu użytkownika.
Aby uzyskać więcej informacji na temat procesów i wątków aplikacji, kliknij tutaj.
Gdy jawnie odradzasz nowy wątek do pracy w tle, ten kod nie jest uruchamiany w UIThread. Więc co się stanie, jeśli ten wątek w tle będzie musiał zrobić coś, co zmieni interfejs użytkownika? Do tego runOnUiThread
służy. Właściwie powinieneś użyć Handlera (zobacz poniższy link, aby uzyskać więcej informacji na ten temat). Zapewnia tym wątkom w tle możliwość wykonywania kodu, który może modyfikować interfejs użytkownika. Robią to, umieszczając kod modyfikujący interfejs użytkownika w obiekcie Runnable i przekazując go do metody runOnUiThread.
Aby uzyskać więcej informacji na temat tworzenia wątków roboczych i aktualizowania ich interfejsu użytkownika, kliknij tutaj
Osobiście używam tej runOnUiThread
metody tylko w moich testach oprzyrządowania. Ponieważ kod testowy nie jest wykonywany w UIThread, musisz użyć tej metody, aby uruchomić kod, który modyfikuje interfejs użytkownika. Dlatego używam go do wstrzykiwania zdarzeń kliknięć i klawiszy do mojej aplikacji. Mogę wtedy sprawdzić stan aplikacji, aby upewnić się, że wszystko się zgadza.
Aby uzyskać więcej informacji na temat testowania i uruchamiania kodu na UIThread, kliknij tutaj
AsyncTask
zamiast zamiastrunOnUiThread
?AsyncTask
wyprowadzą cię z głównego wątku, w tło;runOnUiThread()
przeniesie Cię NA główny wątek, z tła. Więc to zależy od tego, co próbujesz osiągnąć.Jeśli wykonujesz kod blokujący (np. Żądanie HTTP) w oddzielnym wątku, rozważ użycie AsyncTask . Jego
doInBackground
-Method działa w osobnym wątku.AsyncTask
dostarcza metodonProgressUpdate
ionPostExecute
które są gwarantowane do pracy w wątku UI .Jeśli potrzebujesz aktualizacji GUI postępu (np. Przez pasek postępu), zadzwoń do
publishProgress
środkadoInBackground
. Prowadzi to do kolejnego wywołania,onPublishProgress
które jest również gwarantowane do uruchomienia w wątku interfejsu użytkownika .onPostExecute
jest wywoływana automatycznie podoInBackground
powrocie.źródło
Wszystkie rysunki interfejsu użytkownika itp. Są umieszczane w osobnym wątku. Nazywa się UIThread. Jeśli chcesz wprowadzić jakąkolwiek zmianę w UI, musisz użyć, upewnij się, że dzieje się to w kontekście UIThread. Najłatwiej to zrobić, korzystając z
runOnUiThread
źródło