android 主線程消息隊列更新View

主線程消息隊列提供的方法

基本上只要繼承自View的控件,都具備消息隊列或者handler的一些處理方法,下面是一些handler方法以及被View封裝了的方法,其底層用的基本都是handler的api。java

舉例:查看postDelay的定義android

android.view.Viewapi

 public boolean postDelayed(Runnable action, long delayMillis) {
        final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo != null) {
            return attachInfo.mHandler.postDelayed(action, delayMillis);
        }
        // Assume that post will succeed later
        ViewRootImpl.getRunQueue().postDelayed(action, delayMillis);
        return true;
    }

一般消息更新的用法以下多線程

方法一app

//若是須要延遲更新
new Handler().postDelay(new Runnable(){
  
  public void run()
  {
  //在主線程更新數據和UI
  }
  
},2*1000);

方法二異步

//方案二
TextView testTv = (TextView)findViewById(R.id.test_view_handler_tv);
testTv.postDelay(new Runnable(){
  
  public void run()
  {
  //在主線程更新數據和UI
  }
  
},2*1000);

兩種方案比較,顯然第二種更加經濟環保。post

關於runOnUIThread

Activity中也有一個方法,這個方法發送消息到UI線程,runOnUIThread(Runnable action);spa

先來看看他的源碼實現線程

java.app.Activitycode

 public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

 

很顯然,當方法運行在UI線程上時當即執行,不然發送消息到UI線程以後再執行。

runOnUIThread又爲咱們省卻了建立Handler的異步,好比在多線程中,在子線程中不再用使用handler發送消息了,徹底能夠在子線程中調用這個方法來「更新」UI了(注意哦,這裏實際上會發送消息和執行代碼段到UI線程,並非在子線程上更新)

Activity.runOnUiThread不能夠發送延遲執行的方法,爲此咱們須要定製能夠延遲的runOnUiThread方法

Activity運行時會依附於Window之上,而且在Activity中默認具備根DecorView存在,這個默認根視圖沒法被覆蓋,但他永遠存在,座位一個View,爲了「多快好省」的原則,咱們應該充分利用這個DecorView

以下就是自定義的runOnUiThread:

public void runOnUiThread(Runnable action,int delayMillis) 
{
	getWindow().getDecorView().postDelayed(action, delayMillis);
}

 

 

 

try doing it!

相關文章
相關標籤/搜索