Android采用UI单线程模型,所以工作线程(非UI线程)与UI线程的通信是不可避免的。工作线程与UI主线程通信(进行更新UI等操作)主要有以下三种方式。
First :
Looper.getMainLooper()
Runnable task = getTask();
new Handler(Looper.getMainLooper()).post(task);
Second :
Activity#runOnUiThread()
Runnable task = getTask();
runOnUiThread(task);
The implements of runOnUiThread is shown as bellow :
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
It will check if the current Thread is already the UI thread and then execute it directly. Posting it as a message will delay the execution until you return from the current UI-thread method.
Third:
There is also a third way to execute a Runnable on the UI thread which would be View#post(Runnable) - this one will always post the message even when called from the UI thread. That is useful since that will ensure that the View has been properly constructed and has a layout before the code is executed.