2010-09-06 3 views
69

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

общественности окончательное недействительным runOnUiThread (Runnable действие)

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

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

Спасибо

ответ

129

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

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

For more info on your application's Processes and Threads click here.

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

For more info on spawning worker threads and updating the UI from them click here

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

For more info on testing and running code on the UIThread click here

+3

Отличное объяснение, особенно ссылка на основные принципы приложения, которую он должен читать для всех начинающих, таких как я :) –

+1

В большинстве случаев вы не используете 'AsyncTask' вместо' runOnUiThread'? – JDJ

+3

@JDJ 2 метода имеют разные цели: 'AsyncTask' выведет вас из основного потока, в задний план; 'runOnUiThread()' получит вас в основной поток, из фона. Так что это зависит от того, что вы пытаетесь выполнить. –

3

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

+0

Можете ли вы подготовить структуры данных виджетов (например, раздуть макет) в потоке нелитератора, а затем нарисовать их позже в потоке пользовательского интерфейса? –

+0

никогда не пробовал, но технически это должно быть возможно, так как надувание просто создает структуру данных. Его часть, когда u attach относится к активности и т. Д., Когда вам нужно сделать это в контексте UIThread. – the100rabh

8

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

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

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

Смежные вопросы