精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

View.post() 不靠譜的地方你知道嗎?

開發 開發工具
View.post() 方法,在不同版本的差異,根本原因還是在于 Api23 和 Api24 中,executeActions() 方法的調用時機不同,導致 View 在沒有 mAttachInfo 對象的時候,表現不一樣了。

這篇文章之前發過一遍,但是有讀者指出來有些地方描述的有問題,我后來再看的時候也覺得有問題,所以把之前的文章刪掉(主線是沒有問題的,刪掉只是是避免更多的人誤會),準備修改勘誤之后,再重新發布一遍,這次會補齊描述問題的 Demo 。

有問題繼續文章后面留言,再次感謝細心的讀者指出文章內的錯誤。

一、前言

有時候,我們會需要用到 View.post() 方法,來將一個 Runnable 發送到主線程去執行。這一切,看似很美好,它最終會通過一個 Handler.post() 方法去執行,又避免我們重新定義一個 Handler 對象。

但是,在 Android 7.0(Api level 24) 上,View.post() 將不再那么靠譜了,你 post() 出去的 Runnable ,可能永遠也不會有機會得到執行。我們先來看看它們的細節。

二、post 在 7.0 的差異

2.1 post 方法的差異

前面提到,這個問題只出現在 Android 7.0 上。那么就先從源碼分析 Android 7.0 到底對 View.post() 做了什么改動。

用 Diff 看一下它們的差異,左邊是 Api Level 24(以下簡稱 Api24) 的代碼,右邊是 Api level 23-(以下簡稱 Api23) 的代碼。

很明顯的可以看出來,它們只有在 mAttachInfo 為 null 的時候,執行的邏輯才會有差異。

Api24 中,會調用 getRunQueue().post(action),而 Api23 會調用 ViewRootImpl.getRunQueue().post(action) 方法,他們的差異就在這里。

2.2 Api23 post 的細節

先簡單理解一下,ViewRootImpl 是什么。

ViewRootImpl 可以理解是一個 Activity 的 ViewTree 的根節點的實例。每個 ViewRootImpl 就是用來管理 DecorView 和 ViewTree。

ViewRootImpl 中,用來承載 Runnable 的隊列是 sRunQueues ,它一個靜態的變量,也就是說在 App 的生命周期內,ViewRootImpl 中的這個消息隊列都是同一個。

再來看看前面提到的 ViewRootImpl.getRunQueue().post() 到底干了什么?

post() 方法只是單純的將它包裝成一個 HandlerAction 對象,然后放入 mActions 這個 ArrayList 中。繼續追查下去就需要知道 mActions 中添加的 HandlerAction 在何時被消費掉了。

消費 HandlerAction 的地方,是 executeActions() 方法。

它最終,還是調用的 handler.postDelayed() ,這沒什么好說的,關鍵點在于 executeAction() 方法,是在什么時候被調用的。

executeAction() 是被 TraversalRunnable 調用 doTraversa() ,在doTraversa() 方法中,進行調用的。而 TraversalRunnable 又是通過 Choreographer.postCallBack() 去循環調用的。這個 Choreographer 通過 doScheduleCallback() 發送一個 MSG_DO_SCHEDULE_CALLBACK 類型的消息循環調用,間隔就是一個 VSync 的間隔。

關于 Choreographer ,不是本文的重點,有興趣可以單獨了解一下。

而在 Api23 以下,executeAction() 是會被循環調用,基本上其內的 mActions 中,只要有未執行的 Runnable 立刻就會被消費掉。

所以在 Api23 以下的設備上,無論如何 View.post() 基本上是靠譜的,post 出去的 Runnable 都會有機會執行到。

2.3 Api24 的細節

再來看看在 Api24 中的實現細節,在 Api24 中,調用的是 getRunQueue().post() 方法,它操作的是一個 HandlerActionQueue 對象。

內部的結構其實和 Api23 很像,也是維護了一個 HandlerAction 的數組 mActions 。

最終消費 mActions 的地方,依然是一個 executeActions() 方法。

回到根本的問題,executeActions() 方法在什么時機會被調用到,繼續追查可以看到它在 View.dispatchAttachedToWindow() 方法中,會被調用。

既然,executeActions() 方法,在 Api24 及以上,只會在 dispatchAttachedToWindow() 的方法中,才有機會被調用到,而 View.dispatchAttachedToWindow() 方法,只有在這個 View 通過 addView() 方法,或者原本寫在頁面布局的 xml 中(實際上也是調用的 addView()),加入到一個 ViewGroup 的時候,才會被調用到。

這就導致,如果你只是通過 new 或者使用 LayoutInflater 創建了一個 View ,而沒有將它通過 addView() 加入到 布局視圖中去,你通過這個 View.post() 出去的 Runnable ,將永遠不會被執行到。 這也就是到了 Api24 下,View.post() 表現的現象不一致的緣故。

三、舉個例子說明問題

既然只是復現這個問題,秉承最小改動原則,構造一個最簡單的場景,單獨 new 一個 View 出來,然后通過它去調用 post() 方法,看看執行的結果。

可以看到,這里直接 new 了一個 View,然后 post 出去了一個 Runnable ,間隔 10s 之后,將這個 View 加入到根布局中。

看看在 Api 23 下的執行效果:

可以看到,在 Api 23一下,這里是 Api19,新 new 出來的 View 對象,post 出去的 Runnable ,會立即得到執行,不需要等待 addView() 的執行。

再來看看在 Api24 下的執行效果:

從執行時間上可以看出來,post 出去的 Runnable ,并不是立即被執行了,而是等到了 addView() 的調用之后,才被執行的,這個中間正好被間隔了 10s。

據說這個問題,在 Android 8.0 上又被修改回去了,專門找了一款 8.0 的設備試試運行結果,如下圖:

25 是 Android 8.0 的預覽版,這里可以看到,依然是和在 7.0 上的表現一樣,會等到最終 addView() 的時候再執行,正式版不知道會不會有所改動,這個還有待驗證。

基本上確定,受到影響的是 Android Api 24+,但是依然是開發者需要注意的,畢竟發布出去的 App ,具體運行在什么設備上,這就不是我們能決定的了。

四、小結

View.post() 方法,在不同版本的差異,根本原因還是在于 Api23 和 Api24 中,executeActions() 方法的調用時機不同,導致 View 在沒有 mAttachInfo 對象的時候,表現不一樣了。

所以我們在使用的過程中需要慎用,區分出實際使用的場景,一般規范自己的代碼即可:

動態創建的 View ,如果視條件去決定是否加入到根布局中,則不要使用它來調用 post() 方法。

盡量避免使用 View.post() 方法,可以直接使用 Handler.post() 方法來替代。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2024-01-01 08:25:53

ViewSurface框架

2020-09-28 11:14:57

線程數據語言

2023-12-12 08:41:01

2021-10-14 06:52:47

算法校驗碼結構

2022-09-29 15:32:58

云計算計算模式

2024-09-18 07:00:00

消息隊列中間件消息隊列

2014-08-04 09:30:43

170

2022-03-10 08:25:27

JavaScrip變量作用域

2019-12-12 09:23:29

Hello World操作系統函數庫

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2024-04-30 09:02:48

2023-04-26 10:21:04

2023-12-20 08:23:53

NIO組件非阻塞

2011-12-26 14:11:47

三星Android

2024-12-04 08:40:19

2021-10-28 16:19:37

物聯網人工智能IoT

2014-05-30 10:23:15

樂跑手環智能手環運動手環

2024-10-15 11:37:06

2020-10-08 18:58:46

條件變量開發線程
點贊
收藏

51CTO技術棧公眾號

狠狠色丁香九九婷婷综合五月| 精品国产一区二区三区久久久樱花 | 国产5g成人5g天天爽| 黄色成人影院| 99久久久国产精品免费蜜臀| 日本sm极度另类视频| www.97视频| 蜜桃一区二区| 日韩欧美国产一区二区在线播放| 久久国产亚洲精品无码| 女女色综合影院| 91女人视频在线观看| 91久久国产精品| 91video| 欧美三级网页| 色老头一区二区三区| 国产免费无码一区二区| 看片一区二区| 色综合久久天天| 女人床在线观看| av播放在线观看| 91麻豆文化传媒在线观看| 91在线|亚洲| 亚洲精品国产精品国自产网站按摩| 欧美久久久久| 久久精品国产亚洲7777| 大又大又粗又硬又爽少妇毛片| 精品中文在线| 欧美日韩免费观看一区二区三区| 水蜜桃色314在线观看| 岛国成人毛片| 中文字幕在线一区二区三区| 久久99久久精品国产| www.爱爱.com| 激情文学综合丁香| 国产九九精品视频| jizz国产在线| 日韩精品久久久久久| 久久99国产精品久久| 色偷偷av亚洲男人的天堂| 久久久久亚洲av无码专区桃色| 中文无码日韩欧| 欧美一级理论性理论a| 欧美成人三级在线播放| 日韩另类视频| 在线观看欧美精品| 91黄色免费网站| 91亚洲精品视频| 中文字幕精品一区二区精| 国产精品日本欧美一区二区三区| 久久久久国产精品免费网站| 九九九在线视频| 欧美在线高清| 欧美激情精品久久久久久| 极品盗摄国产盗摄合集| 午夜精品久久| 欧美激情久久久久久| 久久久久久久久久一区二区三区| 欧美福利电影在线观看| 欧美福利在线观看| 日本少妇在线观看| 久久福利一区| 国产精品视频精品视频| 一二三四区视频| 国产乱对白刺激视频不卡| 99视频国产精品免费观看| www天堂在线| 成人激情文学综合网| 国产伦理久久久| 巨骚激情综合| 国产精品成人一区二区艾草| 欧美 国产 精品| 久久不射影院| 欧美性极品少妇精品网站| 可以免费在线看黄的网站| 成人免费在线观看视频| 欧美亚洲自拍偷拍| 国产黄色一区二区三区| 精品亚洲免a| 亚洲亚裔videos黑人hd| 影音先锋男人资源在线观看| 欧美一区精品| 青青青国产精品一区二区| 男人天堂视频网| 国产一区二区三区观看| 国产精品区一区二区三含羞草| 日本在线视频1区| 国产精品久久国产精麻豆99网站| 国产人妻人伦精品| sese综合| 日韩久久久久久| 亚洲精品乱码久久久久久久久久久久| 99久久影视| 91精品国产电影| 亚洲一级特黄毛片| 成人免费视频免费观看| 午夜久久资源| 3344国产永久在线观看视频| 欧美午夜电影网| 国产精品一级无码| 欧洲视频一区| 国产+人+亚洲| 国产精品熟女久久久久久| 99re免费视频精品全部| 国产精品h视频| 国产精品av一区二区三区| 欧美一区二区久久久| 99久久人妻无码精品系列| 亚洲精品一二三区区别| 国产成+人+综合+亚洲欧美丁香花| 国产又粗又长又大视频| 久久先锋影音av| 国产 欧美 日韩 一区| 国产欧美自拍| 亚洲欧美激情四射在线日| 免费成年人视频在线观看| 丝袜亚洲另类丝袜在线| 国产传媒一区二区| 精品176二区| 在线免费视频一区二区| 中文字幕一区二区人妻电影丶| 99久久综合| 国产精品久久久久一区二区| 性感美女福利视频| 亚洲制服丝袜av| 午夜xxxxx| 色婷婷亚洲mv天堂mv在影片| 国产精品69久久| 亚洲 美腿 欧美 偷拍| 亚洲男人的天堂在线aⅴ视频| 五月婷婷狠狠操| 亚州av日韩av| 69av在线视频| 天天操天天舔天天干| 亚洲最新在线观看| 国产sm在线观看| 亚洲91中文字幕无线码三区| 国产九九精品视频| 午夜激情视频在线观看| 欧美性xxxxx极品少妇| 亚洲综合色一区| 另类激情亚洲| 欧美日韩亚洲一区二区三区在线观看 | 一级特黄aaa| 国产三级一区二区| 国产一级片黄色| 欧美一二区在线观看| 国产成人高清激情视频在线观看| 你懂的免费在线观看视频网站| 午夜精品福利一区二区蜜股av | 国产日本欧美一区二区| 欧美一级黄色片视频| 亚洲电影一级片| 欧美诱惑福利视频| 九九九伊在人线综合| 91黄色免费网站| 538精品视频| 久久69国产一区二区蜜臀| 中文字幕精品一区日韩| 电影中文字幕一区二区| 九九热精品视频国产| 丰满人妻一区二区| 婷婷综合在线观看| 成年人在线观看av| 日韩avvvv在线播放| 亚洲综合欧美日韩| 日韩精品视频中文字幕| 欧美精品videos性欧美| 午夜在线观看视频18| 色乱码一区二区三区88| 免费黄色激情视频| 国产成人欧美日韩在线电影| av免费观看大全| 国产精品免费大片| 91免费在线视频网站| 国产美女一区视频| 亚洲丝袜在线视频| 国产又黄又粗又硬| 精品久久久久久久久国产字幕 | 手机亚洲手机国产手机日韩| 成人国产在线激情| 久草在线视频资源| 亚洲欧美视频在线| av中文字幕第一页| 欧美日韩精品在线视频| 国产又粗又猛又爽又黄的视频四季| 国内精品第一页| 精品久久一二三| 日韩国产欧美| 国产一区精品在线| 精品69视频一区二区三区| 欧美高清自拍一区| 国产午夜精品一区理论片| 日韩欧美一区在线| 成人免费一级片| 亚洲一区视频在线| 人妻精品久久久久中文| 丁香亚洲综合激情啪啪综合| 搡女人真爽免费午夜网站| 亚洲天堂偷拍| 一级全黄肉体裸体全过程| 日韩高清成人在线| 91av免费看| 日本欧美韩国| 91精品国产高清久久久久久久久| 在线观看免费网站黄| 亚洲精品美女在线观看播放| 国产男女无套免费网站| 色成人在线视频| 日本少妇激情视频| 亚洲欧美综合色| 欧美 日韩 国产 成人 在线观看| 国产成人精品影视| 日本高清一区二区视频| 日韩av中文字幕一区二区三区 | 人人草在线视频| 美女999久久久精品视频| 啊v视频在线| 亚洲精品日韩丝袜精品| 亚洲成人久久精品| 制服丝袜中文字幕一区| 波多野结衣午夜| 丁香五六月婷婷久久激情| 久久黄色免费视频| 亚洲视频一二三| 美女福利视频网| 亚洲国产精品激情在线观看| 国产亚洲无码精品| av电影在线观看完整版一区二区| 91大神免费观看| 狠狠色丁香久久婷婷综合丁香| 一路向西2在线观看| 日韩av高清在线观看| 久久综合久久色| 久久欧美肥婆一二区| www国产精品内射老熟女| 黄色精品免费| 中国丰满熟妇xxxx性| 欧美久久99| 天堂8在线天堂资源bt| 国产精品www.| 国产又粗又猛又爽又黄的网站 | 欧美污视频网站| 国产精品日韩精品欧美精品| 一女被多男玩喷潮视频| 国产欧美日韩一区二区三区在线| 成人网站免费观看入口| 亚洲电影成人| 日韩av在线第一页| 久久美女性网| 欧美一级特黄a| 久久99精品一区二区三区| 女同激情久久av久久| 精品一区二区免费在线观看| 亚洲综合123| 国产91精品久久久久久久网曝门| av在线天堂网| 99久久久久久99| 美女被到爽高潮视频| 国产亚洲一本大道中文在线| 韩国女同性做爰三级| 国产精品入口麻豆九色| 国产白丝一区二区三区| 亚洲欧美另类小说| 国产精品a成v人在线播放| 午夜精品免费在线观看| 久久人妻免费视频| 欧美日韩亚洲国产综合| av男人天堂av| 亚洲国产精品yw在线观看| 你懂的视频在线观看| 中国china体内裑精亚洲片| 精品欧美色视频网站在线观看| 精品少妇v888av| 自拍视频在线看| 国产综合视频在线观看| 亚洲一区二区三区在线免费| 精品国产乱码久久久久久88av | 成人午夜免费在线视频| 99亚洲视频| 国产视频手机在线播放| 国产激情91久久精品导航| 人妻在线日韩免费视频| 中日韩免费视频中文字幕| 欧美黄色免费在线观看| 欧美性猛交xxxx免费看| 亚洲天堂中文字幕在线| 日韩欧美亚洲国产另类| 国产中文字幕在线视频| 久热精品视频在线| 芒果视频成人app| 91在线高清免费观看| 亚洲免费观看高清完整版在线观| 一区二区三区不卡在线| a91a精品视频在线观看| 小早川怜子一区二区三区| 91蝌蚪porny成人天涯| 亚洲欧美精品aaaaaa片| 欧美性猛交丰臀xxxxx网站| 国产成人麻豆精品午夜在线| 国产婷婷97碰碰久久人人蜜臀| 麻豆传媒视频在线观看| 91sa在线看| 精品国产乱码一区二区三区| 神马影院一区二区三区| 亚洲日产国产精品| 国产大片一区二区三区| 国产欧美日韩综合| 日韩精品――中文字幕| 日韩一区二区免费在线观看| yourporn在线观看中文站| 午夜精品久久17c| 日韩精品中文字幕一区二区| 亚洲免费在线精品一区| 亚洲一区观看| 国产原创剧情av| 亚洲精品国产精品乱码不99| 中文字幕一区二区三区免费看| 亚洲精品91美女久久久久久久| 精品国产99久久久久久| 国产精品丝袜视频| 精品盗摄女厕tp美女嘘嘘| av免费观看国产| 成人性生交大片免费看中文网站| 三级影片在线观看| 欧美性大战久久久久久久| 日本福利在线观看| 91av网站在线播放| 另类图片第一页| 青青草视频在线免费播放 | 51午夜精品国产| 99re在线视频| 国产精品久在线观看| 狠狠色狠狠色综合婷婷tag| 国产精品动漫网站| 91小视频在线观看| 精品成人久久久| 亚洲国产99精品国自产| 精品精品导航| 国产精品亚洲不卡a| 今天的高清视频免费播放成人| 交换做爰国语对白| 一区二区三区四区高清精品免费观看 | 亚洲精品日韩欧美| 亚洲精品国产精品国产| 免费久久久一本精品久久区| 一本色道久久综合亚洲精品不| 免费黄色三级网站| 欧美日韩国产一区中文午夜| 亚洲欧洲国产综合| 国产成+人+综合+亚洲欧洲| 日本不卡电影| 国产一区二区在线观看免费视频| 国产精品天干天干在观线| 一区二区三区午夜| 久久躁日日躁aaaaxxxx| 88久久精品| 波多野结衣av一区二区全免费观看| 成人在线视频一区| 国产视频91在线| 一个色综合导航| 亚洲人成网站在线在线观看| 日本美女爱爱视频| 成人午夜视频在线观看| av黄色在线播放| 一区二区在线视频播放| 国产精品亚洲欧美日韩一区在线| 第九区2中文字幕| 91麻豆国产精品久久| 免费黄色一级大片| 欧美成年人视频网站欧美| 国产 日韩 欧美 综合 一区| 女人扒开屁股爽桶30分钟| 欧美经典一区二区| 99在线精品视频免费观看软件| 隔壁老王国产在线精品| 欧美少妇性xxxx| 国产精品久久久久久久av福利| 亚洲一区二区av在线| 精品成人一区二区三区免费视频| 国产主播在线一区| 很黄很黄激情成人| 国产传媒国产传媒| 精品久久人人做人人爽| 高清电影一区| 97碰在线视频| 国产日韩欧美一区二区三区综合| 99久久久国产精品无码网爆| 8x海外华人永久免费日韩内陆视频| 成人免费在线播放| 在线播放av网址| 欧美天堂一区二区三区| 91桃色在线| 懂色av一区二区三区四区五区| 波多野结衣一区二区三区| 亚洲专区在线播放| 97婷婷大伊香蕉精品视频| 无需播放器亚洲| 粉嫩av蜜桃av蜜臀av| 在线成人午夜影院|