Что такое Android UiThread (поток пользовательского интерфейса)

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

public final void runOnUiThread (Runnable action)

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

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

Спасибо

Ответ 1

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

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

Подробнее о вашем приложении "Процессы и темы" нажмите здесь.

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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