Что такое Android UiThread (UI thread)

Может ли кто-нибудь объяснить мне, что такое поток пользовательского интерфейса? На developer.android.com говорится о функции runOnUiThread

Public final void runOnUiThread (Runnable action)

Поскольку: API Level 1 Запускает указанное действие в потоке пользовательского интерфейса. Если текущий поток является потоком пользовательского интерфейса, то действие выполняется немедленно. Если текущий поток не является потоком пользовательского интерфейса, действие отправляется в очередь событий потока пользовательского интерфейса.

Является ли поток пользовательского интерфейса означающим, что это будет выполняться каждый раз, когда активность будет подталкивать фон некоторыми действиями ui, такими как входящий вызов или затемнение экрана и т. Д.? Если нет, что именно включает поток пользовательского интерфейса?

спасибо

UIThread является основным потоком выполнения для вашего приложения. Именно здесь выполняется большая часть вашего кода приложения. В этом потоке создаются все ваши прикладные компоненты (Activities, Services, ContentProviders, BroadcastReceivers), и любые системные вызовы этих компонентов выполняются в этом потоке.

Например, скажем, ваше приложение представляет собой один класс Activity. Затем все методы жизненного цикла и большая часть вашего кода обработки событий запускаются в этом UIThread. Это такие методы, как onCreate , onCreate , onPause , onDestroy и т. Д. Кроме того, здесь onDestroy все обновления для пользовательского интерфейса. Все, что заставляет пользовательский интерфейс обновляться или изменяться, должно произойти в потоке пользовательского интерфейса.

Для получения дополнительной информации о процессах и потоках вашего приложения нажмите здесь.

Когда вы явно создаете новый поток для работы в фоновом режиме, этот код не запускается в UIThread. Итак, что произойдет, если этот фоновый поток должен сделать что-то, что изменит пользовательский интерфейс? Это то, за runOnUiThread работает runOnUiThread . На самом деле вы должны использовать обработчик (см. Ссылку ниже для получения дополнительной информации об этом). Он предоставляет этим фоновым потокам возможность выполнять код, который может изменять пользовательский интерфейс. Они делают это, помещая UI-модифицирующий код в объект Runnable и передавая его методу runOnUiThread.

Для получения дополнительной информации о нерестах рабочих потоков и обновлении пользовательского интерфейса от них нажмите здесь.

Я лично использую runOnUiThread метод runOnUiThread в своих тестах Instrumentation. Поскольку тестовый код не выполняется в UIThread, вам необходимо использовать этот метод для запуска кода, который изменяет пользовательский интерфейс. Поэтому я использую его для ввода кликов и ключевых событий в мое приложение. Затем я могу проверить состояние приложения, чтобы убедиться, что все произошло правильно.

Для получения дополнительной информации о тестировании и запуске кода в UIThread нажмите здесь.

Если вы выполняете код блокировки (например, Http-Request) в отдельном потоке , подумайте об использовании AsyncTask . Его doInBackground -Method работает на отдельном потоке. AsyncTask предоставляет вам методы onProgressUpdate и onPostExecute которые гарантированно работают в потоке пользовательского интерфейса .

Если вам нужны обновления GUI-progress (например, через publishProgress прогресса), вызовите publishProgress внутри doInBackground . Это приводит к последующему вызову onPublishProgress .

onPostExecute автоматически doInBackground после doInBackground возвращается.

Все рисунки пользовательского интерфейса и т. Д. Происходят в отдельном потоке. Его называют UIThread. Если вы хотите внести какие-либо изменения в UI, вы должны использовать, убедитесь, что это происходит в контексте UIThread. Самый простой способ сделать это – использовать runOnUiThread

Intereting Posts
Откройте твиттер Twitter с помощью собственного приложения Twitter на Android Как избавиться от дополнительного интервала в LinearLayout? InvocationTargetException при раздувании xml – андроида В Firebase 9.0.0 API, как проверить, что пользователь имеет действительный сеанс аутентификации или нет? StopSelf не останавливает мое обслуживание Документ не имеет исключения корневого элемента, используя простой XML-сериализатор (v2.6.6) Увеличение скорости сканирования WiFi Трансформация / просмотр анимации в Activity1 для просмотра в Activity2 Получить событие click с веб-страницы в приложении для Android Получение предупреждения Не нашел класс «com.qualcomm.qti.Performance» Как разместить центр макета в правом верхнем углу другого макета? Как использовать std :: stoul и std :: stoull в Android? Не удалось выполнить dex: превышение верхнего предела GC в Eclipse Платежная страница платежной системы Paypal нарушена в веб-браузере Android Как нарисовать интерактивную полилинию на маршруте google maps v2 android