Есть ли разница между
new Handler.post(Runnable r);
и
activity.runOnUiThread(Runnable r)
Есть ли разница между
new Handler.post(Runnable r);
и
activity.runOnUiThread(Runnable r)
runOnUiThread
в основном подходит для отображения диалогового окна прогресса или выполнения некоторых пользовательских интерфейсов перед вызовом AsyncTask
.
Если вы хотите обновить пользовательский интерфейс в середине выполнения потока, лучший подход - создать Handler
, который обновит ваш пользовательский интерфейс и продолжит работу потока, например, периодически обновляя текстовое представление после нескольких сек, скажем, функции таймера.
Из официального Handler docs
Обработчик
Для обработчика используются два основных вида использования:
(1) Планировать сообщения и исполняемые файлы, которые должны выполняться как некоторая точка в будущее.
(2) Чтобы установить действие, выполняемое в другом потоке, ваш собственный.
Короче говоря, Handler используется для управления различными Runnables.
runOnUiThread
Он используется для выполнения операции без UI в потоке пользовательского интерфейса, пример если вы хотите обновить экран из AsyncTask doInBackground() вы должны написать часть кода, которая обновляет пользовательский интерфейс внутри runOnUiThread(). Но снова это заблокирует пользовательский интерфейс.
A Handler
прикрепляется к потоку, на котором он был создан.
handler.post(Runnable)
может использоваться для запуска кода в потоке. К обработчику прилагается.
Activity.runOnUIThread(Runnable)
всегда запускает данный runnable в активности UIThread. Internnaly делает это через обработчик Activity создает при построении так:
final Handler mHandler = new Handler();
Следовательно, код runonUiThrad выглядит следующим образом:
public final void More ...runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
Поскольку вы можете видеть, является ли текущий поток не потоком пользовательского интерфейса, он отправляет заданный runnable на свой обработчик элемента, о котором мы говорили ранее.
Если вызывающий объект уже находится в потоке ui, он просто вызывает runnable.
Ради код здесь.