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

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

public final void runOnUiThread (действие Runnable)

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

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

Спасибо


person user434885    schedule 06.09.2010    source источник


Ответы (3)


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

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

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

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

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

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

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

person plainjimbo    schedule 06.09.2010
comment
Отличное объяснение, особенно ссылка на основы приложения, ее обязательно нужно прочитать всем новичкам, таким как я :) - person Java Student; 11.10.2013
comment
Разве в большинстве случаев не следует использовать AsyncTask вместо runOnUiThread? - person JDJ; 12.06.2014
comment
@JDJ две техники имеют разные цели: AsyncTask переведет вас из основного потока в фоновый режим; runOnUiThread() переведет вас в основной поток из фона. Так что это зависит от того, чего вы пытаетесь достичь. - person Richard Le Mesurier; 28.01.2015

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

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

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

person Martin Pabst    schedule 05.02.2014

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

person the100rabh    schedule 06.09.2010
comment
Можете ли вы подготовить структуры данных виджета (например, раздуть макет) в потоке без пользовательского интерфейса, а затем нарисовать их позже в потоке пользовательского интерфейса? - person SMBiggs; 21.07.2012
comment
никогда не пробовал, но технически это должно быть возможно, поскольку inflate просто создает структуру данных. Его часть, когда вы присоединяетесь к действию и т.д., - это когда вам нужно сделать это в контексте UIThread. - person the100rabh; 22.07.2012