1. 程式人生 > >Android7.0 View.post與Handler.post

Android7.0 View.post與Handler.post

在獲取view寬高時,在Android6.0中使用handler.post()可以正常獲取,而執行在Android7.0上則無法再獲取。而在7.0上改為view.post()方法則又可以正常獲取view寬高。

檢視原始碼和相關資料後知道是因為,雖然這兩個都是post(new runnable(){}),但兩者最終將訊息傳送到的訊息佇列並不一定相同,區別在於View是否已attach到window上。
而view.post()在 Api23 和 Api24 中,executeActions() 方法的呼叫時機不同,導致 View 在沒有 mAttachInfo 物件的時候,表現不一樣。

驗證測試:
我們在自定義view的layout()方法中新增

@Override
public void layout(@Px int l, @Px int t, @Px int r, @Px int b) {
   super.layout(l, t, r, b);
   Log.i("Demo","================view.layout");
}

在測量使用view的寬高處新增

view.post(new Runnable() {
         @Override
         public void run() {
            Log.i("Demo"
,"----------------view.post"); } }); new Handler().post(new Runnable() { @Override public void run() { Log.i("Demo","----------------new Handler().post"); } });

執行後可得到結果:
Android6.0:
這裡寫圖片描述
Android7.0:
這裡寫圖片描述

可知Android7.0時,當handler.Post執行時,view還沒有執行layout方法,所以測出的寬高是0,而view.post執行在view的layout後,可以測出正確寬高。

參考資料:(重要)
1、view.post和Handler.post區別:http://blog.csdn.net/a740169405/article/details/69668957
2、API23和API24 view.post()變化:http://www.jb51.net/article/122395.htm