В чем разница между Activity.runOnUiThread (выполняемое действие) и Handler.post ()? - PullRequest
30 голосов
/ 03 декабря 2009

В чем различия / преимущества / недостатки между использованием Activity.runOnUiThread или Handler.post(runnable action) в Android?

Ответы [ 2 ]

23 голосов
/ 03 декабря 2009

Activity.runOnUiThread, как следует из названия, будет выполнять Runnable в потоке, который в настоящее время отвечает за пользовательский интерфейс. Таким образом, если у вас есть задача с интенсивным использованием ЦП, пользовательский интерфейс может перестать отвечать на запросы в течение короткого периода времени. И наоборот, Handler предоставляет вам способ создать поток, выполнить некоторый код и уведомить пользовательский интерфейс, когда вы закончите (т.е. Handler.sendMessage).

Документы для обработчика утверждают это лучше, чем я могу:

Когда процесс создан для вашего приложение, его основной поток выделенный для запуска очереди сообщений который заботится об управлении прикладные объекты верхнего уровня (мероприятия, приемники вещания и т. д.) и любые окна, которые они создают. Вы можете создавать свои собственные темы, и связаться с главным Поток приложения через обработчик. Это делается путем звонка в тот же пост или методы sendMessage, как и раньше, но из вашей новой темы. Данный Runnable или сообщение будет чем запланировано в сообщении обработчика очередь и обрабатывается при необходимости.

0 голосов
/ 08 февраля 2018

Activity.runOnUiThread() - это особый случай более общих обработчиков. С Handler вы можете создать свой собственный запрос на событие в вашей собственной теме. Использование обработчиков, созданных с помощью конструктора по умолчанию, не означает, что «код будет выполняться в потоке пользовательского интерфейса» в целом. По умолчанию обработчики привязаны к потоку, из которого они были созданы. Чтобы создать обработчик, который гарантированно будет привязан к UI (основному) потоку, вы должны создать Handlerobject, привязанный к Main Looper, следующим образом:

Handler mHandler = new Handler(Looper.getMainLooper());

Более того, если вы проверяете реализацию метода runOnuiThread(), он использует Handler для выполнения следующих действий:

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

Как видно из фрагмента кода выше, действие Runnable будет выполнено немедленно, если из потока пользовательского интерфейса вызывается runOnUiThread(). В противном случае он отправит его в обработчик, который будет выполнен через некоторое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...