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
Отличное объяснение, особенно ссылка на основные принципы приложения, которую он должен читать для всех начинающих, таких как я :) –
В большинстве случаев вы не используете 'AsyncTask' вместо' runOnUiThread'? – JDJ
@JDJ 2 метода имеют разные цели: 'AsyncTask' выведет вас из основного потока, в задний план; 'runOnUiThread()' получит вас в основной поток, из фона. Так что это зависит от того, что вы пытаетесь выполнить. –