基本上只要繼承自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
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!