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()
. В противном случае он отправит его в обработчик, который будет выполнен через некоторое время.