RunOnUiThread vs Looper.getMainLooper(). сообщение в Android

Может ли кто-нибудь сказать мне, есть ли разница между использованием runOnUiThread() и Looper.getMainLooper(). post() для выполнения задачи в потоке пользовательского интерфейса в Android?

Единственное, что я могу определить, это то, что поскольку runOnUiThread - это метод нестатической активности, Looper.getMainLooper(). post() более удобен, когда вам нужно что-то закодировать в классе, который не может видеть действие (например, интерфейс).

Я не ищу дискуссию о том, что что-то должно выполняться в потоке пользовательского интерфейса, я понимаю, что некоторые вещи не могут и многие вещи не должны, однако некоторые вещи (например, запуск AsyncTask) ДОЛЖНЫ выполняться из потока пользовательского интерфейса.

Спасибо,
R.

Ответ 1

Следующее ведет себя так же, когда вызывается из фоновых потоков

через Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);

через Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);

Единственное различие заключается в том, когда вы делаете это из потока пользовательского интерфейса, поскольку

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

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

Существует также третий способ выполнить Runnable в потоке пользовательского интерфейса, который будет View#post(Runnable) - этот всегда будет опубликован сообщение даже при вызове из потока пользовательского интерфейса. Это полезно, поскольку это гарантирует, что View был правильно сконструирован и имеет макет перед выполнением кода.