Разница между Handler.post(Runnable r) и Activity.runOnUiThread(Runnable r)

Есть ли разница между

new Handler.post(Runnable r);

и

activity.runOnUiThread(Runnable r)

Ответ 1

runOnUiThread в основном подходит для отображения диалогового окна прогресса или выполнения некоторых пользовательских интерфейсов перед вызовом AsyncTask. Если вы хотите обновить пользовательский интерфейс в середине выполнения потока, лучший подход - создать Handler, который обновит ваш пользовательский интерфейс и продолжит работу потока, например, периодически обновляя текстовое представление после нескольких сек, скажем, функции таймера.

Ответ 2

Из официального Handler docs

Обработчик

Для обработчика используются два основных вида использования:

(1) Планировать сообщения и исполняемые файлы, которые должны выполняться как некоторая точка в будущее.

(2) Чтобы установить действие, выполняемое в другом потоке, ваш собственный.

Короче говоря, Handler используется для управления различными Runnables.

runOnUiThread

Он используется для выполнения операции без UI в потоке пользовательского интерфейса, пример если вы хотите обновить экран из AsyncTask doInBackground() вы должны написать часть кода, которая обновляет пользовательский интерфейс внутри runOnUiThread(). Но снова это заблокирует пользовательский интерфейс.

Ответ 3

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.

Ради код здесь.