Activity.runOnUiThread(Runnable)
- 如果當前線程是UI線程矗愧,那么會立即執(zhí)行
- 反之骗露,會調(diào)用UI線程
handler.post()
將其放入UI線程的消息隊列中
new Thread(){
public void run() {
//此時在子線程
((MainActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
//此時已經(jīng)回到主線程遭居,注意要強轉(zhuǎn)到主線程的MainActivity
}
});
};
}.start();
View.post(Runnable)
- 如果View已經(jīng)attach到Window,直接調(diào)用UI線程的Handler發(fā)送Runnable到MessageQueue
- 如果View還未attach到Window,將Runnable放入
ViewRootImpl
的RunQueue
中,RunQueue
會實現(xiàn)延遲執(zhí)行Runnable任務(wù)刹淌,并且Runnable最終不會被加入到MessageQueue里,也不會被Looper執(zhí)行讥耗,而是等到ViewRootImpl
的下一個performTraversals
時候有勾,把RunQueue
里的所有Runnable都拿出來并執(zhí)行蛾扇,接著清空RunQueue
mTextView.post(new Runnable() {
@Override
//可快速更新該view
public void run() {
mTextView.setText("xxx");
//也可以更新其他view
mIageView.setBackgroundResource(R.drawable.icon);
}
});
3.Handler.post(Runnable)
//假設(shè)在子線程搏明,需要獲取主線程的Looper和Queue
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//此時已經(jīng)回到主線程
}
});