日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android timer后函数继续执行_一切从android的handler说起(三)

發(fā)布時間:2024/10/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android timer后函数继续执行_一切从android的handler说起(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

閱讀本文大概需要4分鐘。

和小張聊到興起,我就問了android面試界一個眾所周知的問題。

我:之前說到每個線程的looper都在不斷的從message queue里取message來處理,那android系統(tǒng)是如何做到“不斷”二字的?

小張快速回到答:這個我看過一些技術(shù)文章里剖析過源碼,我記得是Looper是在loop()方法里通過for(;;)死循環(huán)里的Message msg = queue.next()這句話來不斷獲取message queue里的下一條message。

我繼續(xù)問道:沒錯,看來你的確接觸過這塊兒的源碼,而且記憶力還挺不錯啊。

緊接著我又問道:我們都知道在UI線程里,系統(tǒng)預(yù)先為我們創(chuàng)建了一個looper,那么UI線程里的looper這個死循環(huán)豈不是占用了所有CPU資源,一打開app豈不是卡出翔?但是我們平時用app很流暢啊,這是怎么回事啊?

聽到這個問題,看小張臉色犯難,感覺當(dāng)時小張的心情是這樣的:

小張:哦,是這樣的 ...

怕什么來什么,躲是躲不過去了,只好硬著頭皮扛下去。

小張沉思片刻,說道:我記得這個循環(huán)比較特殊,并不是普通的死循環(huán),queue.next()是一個可能阻塞線程的操作,也就是說可能會交出CPU執(zhí)行時間片,而不至于導(dǎo)致卡頓或者ANR發(fā)生。

我聽后,感覺有得聊,于是打算趁機(jī)打算再深入一步。

繼續(xù)問道:queue.next()看起來像是去queue里獲取下一條可以處理的message,你能否對這塊兒的邏輯說得詳細(xì)一些呢?

小張:嗯,可以。如果message queue檢查到單鏈表里沒有任何message存在,就會使得線程阻塞在此處,因為沒有任何message可以返回使得loop()方法繼續(xù)下面的處理邏輯,因此也沒有可執(zhí)行的代碼片段,對于CPU來講此線程將會進(jìn)入休眠,就會把時間片分配給其他線程。

如果message queue檢查到單鏈表隊首有message可以立即返回[注1],交給loop()執(zhí)行接下來處理此message 的邏輯,處理完邏輯后。for(;;)又會緊接著循環(huán)到開頭的queue.next()問其要下一條message,如此周而復(fù)始...

聽完小張的回答,我是比較滿意的,畢竟到目前為止,我面的候選人里能回答到這一步的都比較少,心里對小張的印象分提高了不少。

為了考察小張對這個問題的理解到底有多深,我決定打破砂鍋問到底。

我:嗯,很好很好。你的理解基本上是正確的,但這里面有個問題不知道你考慮過沒有,就是當(dāng)message queue在檢查到?jīng)]有message時進(jìn)入了休眠。

那如果此時,用戶此時來一個按鈕點擊事件,點擊事件包裝成的message被handler扔進(jìn)來時,message queue又如何知道,從而立即做出反應(yīng)?

畢竟UI線程是不能錯失任何一個message的,否則對用戶來說就是點擊沒有反應(yīng),對吧?

估計小張聽完感覺內(nèi)心快崩潰了...

小張:這個我只記得queue.next()的源碼里有個nativePollOnce()進(jìn)入了JNI C代碼里,有立即執(zhí)行的message就會立即返回,沒有的話nativePollOnce()無法返回,線程就會進(jìn)入休眠。如果此時有message來時,這里面的邏輯就會喚醒線程,重新進(jìn)行獲取message的邏輯...

我看小張的回答稍顯模糊,估計是到了他理解的極限了,但畢竟離真相只差最后一步了,我懷著試一試的態(tài)度,打算做最后的試探。

于是問道:嗯嗯,能夠理解到這個程度相當(dāng)不錯了。那能夠最后說一下你剛才提到的”喚醒“這塊具體是怎么實現(xiàn)的嗎?

小張故作思考了一下道:這塊兒...不是很了解...

我試圖引導(dǎo)道:看nativePollOnce()這個函數(shù)的名字,有沒有感覺很像Linux的什么機(jī)制?

小張經(jīng)過提示,貌似想起了什么,小聲問道:你說的是Linux的epoll嗎?

到了這一步,我直接攤牌:是的,正是大名鼎鼎的epoll,epoll機(jī)制提供了Linux平臺上最高效的I/O復(fù)用機(jī)制,它能夠在一個地方等待多個文件句柄的I/O事件。

簡而言之,就是android使用pipe管道創(chuàng)建兩個fd文件描述符,nativePollOnce方法中正是承載著這個管道的讀操作,根據(jù)fd知道是管道讀端有可讀事件。

當(dāng)有message來臨時,比如觸摸事件,即會調(diào)用message.enqueueMessage(),添加完message后,調(diào)用了native層的nativeWake方法,就會向管道寫端寫一個“W”字符[注2],這樣就能觸發(fā)管道讀端從epoll_wait函數(shù)返回,從而達(dá)到喚醒線程的目的,從nativePollOnce()處繼續(xù)執(zhí)行下去。

看小張似懂非懂的的表情,我知道這個可能一時半會兒解釋不清楚了。

就微笑著說道:沒事兒,你回答得已經(jīng)挺好的了,關(guān)于pipe/epoll這塊兒的知識點,你可以后面回去查資料了解一下。

小張點了點頭,道:嗯,的確是,對于操作系統(tǒng)的底層知識,的確是我的薄弱點,我一定會加強(qiáng)。

[注1]:這里并非有message即返回,因為此message有可能是由postDelay發(fā)送的延時處理消息,不可立即執(zhí)行,需要等到時間到時才執(zhí)行。關(guān)于此種情況,請見下一篇。

[注2]:關(guān)于這里是如何觸發(fā)的,請等后面的文章。


歡迎轉(zhuǎn)發(fā),關(guān)注公眾號

總結(jié)

以上是生活随笔為你收集整理的android timer后函数继续执行_一切从android的handler说起(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩亚洲国产一区 | 国产一级影片 | 青青操操| 午夜精品久久久久久久久久久久久 | av免费看网址 | 成人精品视频在线播放 | 国产精品电影一区二区三区 | 日本韩国欧美一区 | 免费啪视频| 最新国产三级 | 日本99视频 | 日本一区二区三区四区视频 | caoprom在线| 可以在线观看的黄色 | 国产精品久久九九 | 国产成人精品网站 | 俺也去五月婷婷 | 四虎影视www在线播放 | 欧美成人a| 性色av浪潮 | 伊人成人在线 | 日本在线观看免费 | 中文不卡在线 | 爱色成人网 | 久久精品视频中文字幕 | 国产美女自拍 | xxx视频在线观看 | 欧美美女性生活视频 | 99re只有精品 | 精品国内自产拍在线观看视频 | 无码人妻精品一区二区三区温州 | 另类毛片| 中国国语农村大片 | 欧美影院在线观看 | 五月婷婷久久综合 | 午夜寂寞少妇 | 91免费.| 深夜国产在线 | 日韩精品小视频 | 深爱五月激情五月 | 蜜桃aaa| 国产夜夜操 | 欧美色图首页 | 亚洲精品777 | 久久久国产精品一区 | 91成人免费在线视频 | 久久久久国产精品夜夜夜夜夜 | 国产精品高潮呻吟视频 | 九色91av| 欧美日韩18 | 涩涩视频软件 | 亚洲视频在线视频 | 女女av在线 | 九九影院最新理论片 | av观看网站 | 国产不卡二区 | 久久免费激情视频 | 体内射精一区二区 | 毛片网站免费 | 九九色 | 欧美日本在线播放 | 日韩三级免费看 | 91欧美一区 | 免费在线看黄网址 | 久久精品人妻一区二区 | 丝袜性爱视频 | 日本老熟妇毛茸茸 | 九色91popny蝌蚪 | 麻豆www| 九九少妇| 久草视 | av网站大全在线观看 | 国产一区二区三区四区五区在线 | 国产无遮挡一区二区三区毛片日本 | 久久99国产精品久久99果冻传媒 | 国产精品久久国产精品 | 高清中文字幕在线a片 | 日韩一级在线 | 国产精品视频一区二区三区在3 | 在线免费观看黄色网址 | 狠狠干,狠狠操 | 国产精品美女久久久免费 | 午夜少妇视频 | 2019中文字幕在线 | 亚洲精品久久久久国产 | 成人黄色录像 | 天堂网www | 91看片网站| av爽妇网| 在线欧美一区 | 久久精品—区二区三区舞蹈 | 羽月希奶水一区二区三区 | 欧美黑人一区二区三区 | 国产麻豆一区二区 | 亚洲天堂不卡 | 夜夜草视频 | 欧美福利一区二区三区 | 91午夜精品 | 婷婷视频在线观看 |