而runOnUiThread()會立即執行Runnable, 但post的方式會放到訊息佇列中去排隊, 就算你在主線程中使用post方法, 也一樣會放到主線程的佇列內排隊, 執行(post通常都是放在副線程去更新主線程, 但有時也會放到主線程,在主線程只要直接更新ui即可, 何需使用post, 有時是因為延時, 例如 取view的layout, 在view變動時如果馬上去取, 可能得到null, 所以用view.post 把它放到queue 去排隊, 待layout 改變生成之後再取layout, 才能得到值)
runOnUiThread(Runnable action)是activity的方法,內部實作其實也是靠handler做處裡
Handler可以在副線程(非ui thread)用sendMessage發出訊息, 也可以在主線程(ui thread)接收
副線程送來的的訊息, 並更新主ui介面
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//更新界面
myText.setText( "update");
super.handleMessage(msg);
}
};
public class MyThread extends Thread {
public void run() {
doSomething();
Message msg = new Message();
mHandler.sendMessage(msg);//向Handler發送消息,
}
}
Android 與ui相關的所有操作都必須放到主線程。另外,Android的異步消息機制,主線程是一個消息循環線程,它內部有個looper,裡面是按FIFO的原理管理著Message隊列,並從Handler(在主線程中創建,並綁定到主線程)接收發送過來的消息,同時從隊列尾部一個個把消息拿出來,供與其綁定的handler來處理,這裡handler自己發送消息,自己處理,所以說是異步的。
在一個另一個線程中做一個耗時操作,怎麼來更新UI呢,通用方法:handler+thread。即是thread處理耗時操作,完成後利用handler(這個handler於主線程中創建,但它的引用同樣可以被工作線程調用)向主線程,發送message,主線程中的handler收到消息後,再來處理,從而達到於主線程中更新UI的操作。