精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美精品麻豆| aaa国产精品| 亚洲精品高清在线| 国产一区二区久久久| 一级一片免费看| 久久久久国产| 日韩极品精品视频免费观看| 不卡的av中文字幕| 激情av在线| 国产精品网站在线观看| 国产丝袜不卡| ,一级淫片a看免费| 日韩视频在线一区二区三区 | 欧美性感一类影片在线播放| 中国一级大黄大黄大色毛片| 天堂中文在线8| 激情综合亚洲精品| 日本久久久久久久久| 欧美极品aaaaabbbbb| 成人精品中文字幕| 亚洲成人久久网| 成人高清在线观看视频| 日韩精品影片| 欧美日韩国产中文精品字幕自在自线| 亚洲一区3d动漫同人无遮挡 | 不卡一区二区中文字幕| 国产日本欧美一区二区三区在线 | 国产精品日韩精品欧美精品| 久久精品国产亚洲| 无码国产69精品久久久久同性| а√中文在线天堂精品| 91精品国产欧美日韩| www.xxx亚洲| 欧美激情网站| 亚洲高清免费一级二级三级| 女女百合国产免费网站| eeuss影院www在线播放| 日韩 欧美 精品| 成人性生活视频| 亚瑟在线精品视频| 日本黄大片在线观看| 国产在线1区| 亚洲色图一区二区三区| 一本久道久久综合狠狠爱亚洲精品| 四虎在线免费观看| 91丨porny丨国产| 久久综合福利| 免费黄色在线视频网站| www欧美成人18+| 久久香蕉综合色| 在线观看xxx| 91老师片黄在线观看| 乱色588欧美| 色播色播色播色播色播在线| 91小视频免费看| 欧美不卡三区| 九色视频在线观看免费播放| 久久精品夜色噜噜亚洲a∨| 欧美大香线蕉线伊人久久国产精品 | 韩国三级在线播放| 亚洲不卡视频| 欧美tk—视频vk| 性农村xxxxx小树林| 久久亚州av| 亚洲欧美激情一区| 一区二区三区久久久久| 欧美一区二区三区高清视频| 最近中文字幕2019免费| 污污视频网站在线免费观看| 五月久久久综合一区二区小说| 欧美成人久久久| 97视频中文字幕| 久久久久久婷婷| 日本精品影院| 中文字幕欧美国内| 婷婷久久综合网| 在线日本成人| 日韩av免费看| 国产精品久久777777换脸| 国产高清亚洲一区| 久久99影院| 99精品老司机免费视频| 亚洲精品中文在线| 日本一区二区黄色| 日韩欧美激情| 亚洲第一综合天堂另类专| 波多野结衣一本| 91精品综合| 91av在线看| 亚洲天堂手机在线| 成人精品国产免费网站| 日韩欧美99| 七七久久电影网| 日本性爱视频在线观看| av一区二区三区在线| 日本精品二区| 日本动漫同人动漫在线观看| 欧美三级xxx| 国产资源中文字幕| 婷婷综合福利| 欧美成人激情视频| 四虎成人在线观看| 国产成人亚洲精品青草天美| 日本一区二区三区视频免费看| 国产高清一区二区三区视频| 欧美日韩国产精品一区二区不卡中文 | eeuss影院www在线播放| 亚洲一级电影视频| 自拍偷拍一区二区三区四区| 国产精品香蕉| 久久视频国产精品免费视频在线| 亚洲 欧美 日韩 综合| 国产一区二区三区四区五区入口| 久久久婷婷一区二区三区不卡| 日本在线免费| 在线视频观看一区| 中国一级特黄录像播放| 91精品91| 国产精品日韩在线观看| 天堂av手机版| 亚洲一区二区在线观看视频| 国产精品免费一区二区三区四区| 国产国语性生话播放| 91精品天堂福利在线观看| 日本不卡免费高清视频| 亚洲精品一区二区三区不卡| 亚洲视频一二区| 天天干天天综合| 欧美精品momsxxx| 69视频在线播放| 精品国产乱码一区二区三| 国产精品乱码久久久久久| 妺妺窝人体色www在线小说| 欧美中文高清| 久久久国产影院| 一级特黄色大片| 欧美国产丝袜视频| 成人3d动漫一区二区三区| 亚洲区小说区图片区qvod| 97视频在线免费观看| 亚洲精品911| 一区二区在线免费观看| 久草福利在线观看| 一个色综合网| 91麻豆精品91久久久久久清纯 | 欧美在线极品| 精品第一国产综合精品aⅴ| 欧美激情图片小说| 国产一区不卡精品| 男人天堂新网址| ccyy激情综合| 午夜精品久久久久久久99热浪潮| 亚洲免费成人网| 午夜伊人狠狠久久| 久久人妻一区二区| 免播放器亚洲| 日本一区二区三不卡| 四虎成人在线| 色一情一乱一区二区| 91亚洲欧美激情| 亚洲免费观看高清完整| 一二三区视频在线观看| 亚洲第一伊人| 久精品国产欧美| 亚洲一区二区三区四区| 中文字幕亚洲图片| 国产精品视频一区二区三区,| 亚洲欧美色图小说| 日本精品一二三区| 国产亚洲精品bv在线观看| 欧美福利精品| 久久精品xxxxx| 亚洲人成网站77777在线观看| 久久久久久久久久国产精品| 天堂中文在线看| 欧美最猛性xxxxx直播| 国产激情无码一区二区三区| 国产91对白在线观看九色| 成人黄色av片| 色婷婷亚洲mv天堂mv在影片| 99久久一区三区四区免费| 少妇视频在线观看| 久久久成人av| 香港三日本三级少妇66| 欧美日韩中文字幕一区二区| 黄色在线观看免费| 国产亲近乱来精品视频| 午夜诱惑痒痒网| 亚洲麻豆视频| 伊人色综合影院| 精品欠久久久中文字幕加勒比| 日本电影亚洲天堂| 成人看av片| 亚洲欧美日韩精品久久| av 一区二区三区| 91福利国产精品| 九九热只有精品| 国产午夜精品美女毛片视频| 国产在线观看免费播放| 琪琪一区二区三区| 国产妇女馒头高清泬20p多| 日本一区二区免费高清| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 国产精品亚洲综合一区在线观看| 男人操女人逼免费视频| 天天综合网91| 欧美在线激情| 大奶一区二区三区| 成人综合网网址| 欧美一级大片| 97在线视频观看| 在线中文字幕-区二区三区四区| 亚洲精品中文字| 亚洲欧美国产高清va在线播放| 欧美日韩国产小视频在线观看| 精品成人免费视频| 亚洲精品久久7777| 午夜精品久久久久99蜜桃最新版| 久久毛片高清国产| 在线看黄色的网站| 国产精品1024| 国内视频一区二区| 精品少妇一区二区三区密爱| 久久99国产精品麻豆| 免费黄色福利视频| 精品1区2区3区4区| 久久久成人精品一区二区三区| 精品黄色一级片| 蜜桃麻豆91| 午夜先锋成人动漫在线| 国产乱码精品一区二区三区卡| 亚洲精品777| 国产区精品视频| 不卡亚洲精品| 国产精品视频最多的网站| 欧美中文字幕精在线不卡| 欧美一级视频一区二区| 成年男女免费视频网站不卡| 欧美精品久久一区二区| 四虎影视国产在线视频| 九九久久综合网站| 麻豆电影在线播放| 久久国产精品电影| 高清免费电影在线观看| 美女少妇精品视频| fc2ppv国产精品久久| 另类美女黄大片| 成人影院在线观看| 久久6免费高清热精品| 污污视频在线看| 欧美俄罗斯性视频| 国产精品论坛| 日韩av片免费在线观看| 99热播精品免费| 国产美女精品视频| 国产精品成人**免费视频| 91超碰在线电影| 大型av综合网站| 久久精品人成| 欧洲乱码伦视频免费| 在线一区亚洲| 欧美日韩少妇| 凹凸国产熟女精品视频| 日韩高清国产一区在线| 色综合色综合色综合色综合| 蜜臀av一区二区在线免费观看| 欧美第一页浮力影院| 国产一区在线观看视频| 制服.丝袜.亚洲.中文.综合懂| 处破女av一区二区| 91视频免费观看网站| 国产精品乱人伦| 久久久久无码精品国产| 欧美日韩亚洲91| 亚洲一级av毛片| 精品国产乱码久久久久久图片 | 国产午夜伦鲁鲁| 奇米影视一区二区三区| 丰满少妇中文字幕| 日韩一区电影| 这里只有精品在线观看| 男人资源在线播放| 午夜免费在线观看精品视频| 国产 日韩 欧美一区| 51国产成人精品午夜福中文下载 | 精品国产第一福利网站| 国产狼人综合免费视频| 精品久久对白| 在线亚洲美日韩| 免费看亚洲片| 91大神免费观看| 国产视频一区二区在线观看| 欧美色图亚洲天堂| 色av成人天堂桃色av| www.精品视频| 一本一本久久a久久精品综合小说| www久久日com| 国产精品91视频| 成人看片黄a免费看视频| 亚洲精品视频一二三| 亚洲精品视频啊美女在线直播| 亚洲欧美自偷自拍另类| 播五月开心婷婷综合| fc2ppv在线播放| 欧美日韩综合视频网址| 不卡视频在线播放| 日韩中文字幕在线看| 伊人网在线播放| 超碰97国产在线| 99久久精品费精品国产风间由美| 成人黄色av片| 懂色中文一区二区在线播放| 亚洲精品自拍视频在线观看| 欧美性极品少妇精品网站| 精品人妻一区二区三区三区四区| 一区二区三欧美| 伊人久久精品一区二区三区| 国产一区二区三区四区五区在线 | 久久久久亚洲av无码麻豆| 国产亚洲欧美在线| 国产免费av一区二区| 日韩美女主播在线视频一区二区三区| av电影在线播放高清免费观看| 4438全国成人免费| 在线一区二区三区视频| 浴室偷拍美女洗澡456在线| 日本91福利区| 人妻一区二区视频| 色综合久久综合| 亚洲 国产 欧美 日韩| 韩国v欧美v日本v亚洲| 视频在线亚洲| 日韩视频 中文字幕| 久久国产乱子精品免费女| 日韩一区二区a片免费观看| 激情成人中文字幕| 黄色www视频| 久久久久久久一区二区三区| 在线综合色站| 国产乱码精品一区二区三区忘忧草| 在线成人免费av| 一区二区三区免费网站| 精品人妻一区二区三区换脸明星 | 久久精品国产av一区二区三区| 91精品国模一区二区三区| 看女生喷水的网站在线观看| 91精品啪在线观看麻豆免费| 91av精品| 老司机av网站| 亚洲国产一区视频| 色网站免费观看| 538国产精品视频一区二区| 麻豆一区二区麻豆免费观看| 欧美国产亚洲一区| 91免费国产视频网站| 一二三区免费视频| 一区二区三区亚洲| 日本免费成人| 成年在线观看视频| 99视频一区二区三区| 无码人妻熟妇av又粗又大 | 超碰在线无需免费| 97久久人人超碰caoprom欧美| 国产一区亚洲| 亚洲自拍偷拍一区二区| 欧美午夜在线观看| 菠萝蜜视频国产在线播放| 国产日韩欧美一区二区| 免费亚洲一区| 中国1级黄色片| 日韩视频免费观看高清完整版在线观看| 婷婷色在线资源| 久久久水蜜桃| 黑人精品欧美一区二区蜜桃| 精品小视频在线观看| 精品网站999www| 黄色精品视频网站| www.av毛片| 国产欧美一区二区精品久导航| av中文字幕免费在线观看| 97国产在线视频| 日韩欧美网址| av电影在线播放| 欧美性生交片4| 蜜桃传媒在线观看免费进入| 欧洲精品亚洲精品| 国产精品中文欧美| 中文字幕一区在线播放| 日韩在线观看免费全| 成人香蕉社区| 天天综合网日韩| 精品欧美aⅴ在线网站 | 国内精品一区二区三区四区| 欧洲杯半决赛直播| 中文字幕一区二区人妻电影丶| 在线亚洲高清视频| av最新在线| 91制片厂免费观看| 国产亚洲人成网站| 日批视频免费播放|