Разница между обработчиком.post (Runnable r) и активность.runOnUiThread (Runnable r) [дубликат]

этот вопрос уже есть ответ здесь:

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

new Handler.post(Runnable r);

и

activity.runOnUiThread(Runnable r)

3 ответов


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


официальный проводник docs

проводник

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

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

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

короче говоря, обработчик используется для управления различными Работоспособный.

runOnUiThread

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


A Handler прикрепляется к потоку, на котором он был создан.

handler.post(Runnable) можно использовать для запуска кода на обработчике потока, к которому прикреплен.

Activity.runOnUIThread(Runnable) всегда запускайте данный runnable в UIThread действия. Internnaly он делает это через действие обработчика создает при построении так:

final Handler mHandler = new Handler();

следовательно, код runonUiThrad выглядит так:

public final void More ...runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

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

рад код здесь.