2016年5月10日 星期二

view.post, handle.post, runOnUiThread用法

view.post(Runnable action), handle.post(Runnable action)runOnUiThread(Runnable action)方法一樣, 以上的 Runnable同樣是運行在主線程中.
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的操作。

  © Blogger templates Psi by Ourblogtemplates.com 2008

Back to TOP