Ответ 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
был правильно сконструирован и имеет макет перед выполнением кода.