Что такое Android UiThread (нить пользовательского интерфейса) - PullRequest
76 голосов
/ 06 сентября 2010

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

public final void runOnUiThread (Runnable action)

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

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

Спасибо

Ответы [ 3 ]

137 голосов
/ 06 сентября 2010

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

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

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

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

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

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

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

9 голосов
/ 05 февраля 2014

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

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

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

4 голосов
/ 06 сентября 2010

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

...