延時消息_Handler的消息延時是怎么實現的

  • 消息延時做了什么特殊處理?

  • 是發送延時,還是消息處理延時?

  • 延時的精度如何?

8332123219d856f5fb2db96bf8226640.png

通常我們使用Handler的消息延時都是調用sendMessageDelayed函數實現的,其中delayMillis是需要延時的毫秒。

5953061f283bcec2e0922a2a05c5983c.png

通過跟蹤sendMessageDelayed函數可以發現,最終是調用到了上面這個enqueueMessage方法,其中消息隊列mMessages是單鏈表數據結果。

從上面的源碼中可以看到,當前出入的消息msg時,首先判斷mMessages消息隊列中的第一個消息mMessages.prev,要是當前隊列中消息為空,或者msg立即發送,則將該消息插到消息隊列mMessages的頭部;反之,則會在一個for的死循環中遍歷消息隊列并將傳入消息msg插到單鏈表中合適的位置。事實上,消息隊列是按照消息處理的時間when,按照從近到遠的順序排列的,最先要執行的任務放在消息隊列的頭部,依次排列。

從上面可以看到,Handler中sendMessageDelayed方法只是將消息按照要執行的先后順序插入到消息隊列中的,插入好了并不意味著就會按照設定的延時時間處理消息,那Handler時如何延時處理該消息的呢?

首先我們知道,Looper.loop()之后,線程就進入了消息監聽的階段:

ca819099f924e19957d6015d4ac985a1.png

當Handler中沒有可用消息的時候,上面代碼會一直阻塞在queue.next()的地方,直到消息返回,才會調用dispatchMessage進行消息的處理,要是返回的msg為空,那么Handler就會結束消息監聽,不再監聽任何消息。

我們來看看queue.next()函數:

d0db5960aeb93fb20e40780d5948a365.png

上面是阻塞的從消息隊列中獲取可用消息的過程。其中nativePollOnce方法是一個native方法,其內部會根據傳入的nextPollTimeoutMillis,在延遲這么長時間之后喚醒線程從消息隊列中讀取消息,內部調用的是epoll_wait方法。

我們知道當線程中沒有新消息要處理的時候,線程處于休眠狀態,當其他線程向Handler的消息隊列中寫入消息,這一動作并不會喚醒當前線程處理該消息,還需要向線程的eventfd中寫入數據,從而喚醒休眠的線程開始處理數據,此處也是一樣的,nativePollOnce函數內部會調用epoll_wait方法,設置超時時間為nextPollTimeoutMillis,epoll_wait在這個超時時間之后,就會喚醒線程,開始處理消息隊列中的消息。

next方法中,每次會從消息隊列mMessages中獲取鏈表中頭部的消息,要是頭部消息的設定執行的時間要比當前時間大,說明消息隊列中所有的消息都還沒有到可執行的時間,這是因為消息隊列中消息在插入消息隊列的時候,按照執行時間的先后順序已經排序好了。這種情況下,會計算出一個等待時間,傳遞到nativePollOnce函數中,讓native層在這個等待時間之后再喚醒線程讀取消息隊列中的消息,進行消息處理。

Handler的消息延時的實現:

消息隊列在插入消息的時候是按照消息的觸發時間順序排序的,先執行的消息放在單鏈表的頭部,最后執行的消息放在單鏈表的尾部;

在消息執行的過程中,通過native層設置epoll_wait的超時事件,使其在特定時間喚醒線程開始出現消息。

關于延時精度:Handler的延時精度并不高,會受到前一個消息處理時間的影響,因為在Looper.loop()方法中,只有上一個消息被處理完之后,才會去queue中讀取下一個消息。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5月JC學習總結

斷劍重鑄之日,王者歸來之時。為了更美好的明天而戰。 五月 悄悄地過了 人兒 不覺中散了 攜著一腔熱血;來到蛟川 來到機房 微涼的輕風,無聲地去了 熾熱的驕陽,即將要落了 站在4樓,向窗外眺望,映出的不是夕陽…

4 關卡流 進階_全息武器全解析,記住4個點全區第一就是你!

實不相瞞,每次看著全息武器糖糖都感覺自己像鋼鐵俠高端大氣上檔次,低調奢華有內涵那么問題來了!這個全息武器究竟該怎么玩才能成為真正的鋼鐵俠?我的使命之全息武器【作者:D38激戰阿曼——潛龍小生】全息武器在屬性增加…

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

運行時報錯: terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr:__pos Aborted (core dumped) 內存讀取越界。 解釋1:for example:const std::string sTest( "test" );sTest.substr…

記一次理想浪漫的畢旅

因為臨近畢業離別的氛圍和閑散的生活,雖然手頭積攢了不少可寫的素材和教程,但還是兩個月沒有在CSDN更新博客。論文答辯之后,我只是每天在宿舍玩玩電腦、打打撲克,唯一讓我難受的是,隔幾天便送走一位同窗好友。有時甚至…

【滲透過程】嘉緣網站 --測試

聲明:本片文章測試網站為測試靶場 信息收集階段: 首先使用了一些常見的掃描工具:nmap 御劍 使用nmap掃描端口 發現網站開放了 135 139 445 3306 等端口 這里可以看到網站開放了一些危害較高端口:135 225等 使用御劍掃描到一些敏感…

C編程經驗總結

Turbo c Return (z);return z; 圖形界面的有scanf(“%d ~%d\n”,&~,&~);注意:中間不能有亂的東西 Printf(“~~~ %d~~%d\n”,~,~);這兒可以有亂的東西,一切的提示圖形界面多是由它完成 函數,變量一定是有類型 除了函數(&am…

文檔過期打不開怎么辦_標準的產品需求文檔在這里!(詳細說明版)(2)

接著上篇繼續寫,上篇請點擊標準的產品需求文檔在這里!(詳細說明版)(1)入口已經寫完,讀此文檔的無論是研發人員還是測試都已經知曉此需求需要做的從哪里進入,接下來就是主菜了,進入以后該干嘛。進入以后當然就是新的頁面…

day32

udp(用戶數據包協議) 高并發(同時有大量客戶端訪問服務器,服務器處理不過來)?OSI模型中,屬于傳輸層得協議,僅用于不要求可靠性,以及不要求分組順序且數據量較小的簡單傳輸,力求快?通訊流程類似對講機 只管發送不管對方是否接收到,甚至不關心對方存在?UDP可以處理多個客戶端,…

Macbook全系列詳細分析及購機指南

時至今日,極佳的用戶體驗、強大的功能、獨特的設計感、廣闊的市場和無可比擬的品牌魅力已經讓蘋果公司各種電子產品的迅速普及,其中Macbook逐漸被越來越多的人所青睞,尤其是從事一些特定行業的工作者(比如IT、電信、互聯網以及藝術…

惠普m1005連接電腦步驟_電腦連接電視機詳細步驟方法圖文

電腦連接電視機有什么好處呢?小編想到了幾點,那就是屏幕大,而且可以在電視機上使用網絡看到自己想看的劇。還有就是可以更多的人一起做著來看。所以總的來說電腦連接電視機還是好處比較多的。下面我就來告訴你們電腦怎么連接電視機。有的時候…

對程序實施精準手術!阿里安全獵戶座實驗室首創“自動逆向機器人”

近日舉辦的看雪安全開發者峰會上,阿里安全獵戶座實驗室首度向外界展示了最新的研究成果——“自動逆向機器人”。該機器人可以像醫生一樣“望聞問切”,對程序進行顯微鏡級別的勘察,并完整“回放”其運作過程,因此,可以…

(24) 不可能的出棧順序

一、問題描述 給定兩個數組,一個進棧順序,一個出棧順序。判定出棧數組的出棧順序是不是有可能的。 二、Code 1 package algorithm;2 3 import java.util.ArrayDeque;4 import java.util.Deque;5 6 /**7 * Created by adrian.wu on 2019/5/30.8 */9 pub…

《魔獸世界》的魅力究竟在哪兒?

寫在前面:《魔獸世界》(World of Warcraft,后面簡稱WOW),是由暴雪開發的一款大型角色扮演網絡游戲,曾經付費的正式用戶一度超過1150萬人,覆蓋244個國家和地區,是曾經的“世界第一網游…

Service Mesh所應對的8項挑戰

2019獨角獸企業重金招聘Python工程師標準>>> Lori Macvittie 微服務架構是把雙刃劍,我們享受它帶來的開發速度(development velocity),卻也不得不面對服務間通訊帶來的復雜性問題。 目前大多數擴展容器化微服務的架構多…

stm32cubeide外部中斷_【STM32】HAL庫 STM32CubeMX教程三----外部中斷(HAL庫GPIO講解)

前言上一節我們講解了STM32CubeMX的基本使用和工程的配置,那么這一節我們正式來學習CubeMX配置STM32的各個外設功能了今天我們會詳細的帶你學習STM32CubeMX配置外部中斷,并且講解HAL庫的GPIO的各種函數,帶你學習不一樣的STM32那么話不多說&am…

html5兼容ie

https://www.jb51.net/html5/143049.html轉載于:https://www.cnblogs.com/rivsidn/p/10913532.html

什么叫內部銀團_什么是紫鈦晶?紫鈦晶是不是天然水晶?

都說紫鈦晶是紫水晶與鈦晶的結合,聽上去好像這種水晶不是天然的,像是人工合成的,事實上并非如此,紫鈦晶也是天然形成的水晶,由于內部的包裹體是金色的,因此被稱為紫鈦晶。和菩心晶舍家的晶舞傾城一起了解紫…

如何使用Squid服務來構建=》傳統和透明代理服務器,通俗易懂!

1、緩存代理概述: 作為應用層的代理服務軟件,Squid主要提供緩存加速和應用層過濾控制的功能 2、代理的工作機制: (1)當客戶機通過代理來請求web頁面時,指定的代理服務器會先檢查自己的緩存,若緩…

排序算法-C++實現

#include <iostream>using namespace std;void show(int M[], int n) {for(int i0; i<n; i)cout<<M[i]<<" ";cout<<endl; }//快速排序 void quick_sort(int M[], int left, int right) {if(left < right){int i,j,x;i left;j right;…

Bootstrap開發框架視頻整理

最近到客戶處進行實地培訓&#xff0c;整理了很多培訓的材料&#xff0c;現將它們錄制相關主題的視頻&#xff0c;作為我的Bootstrap開發框架的知識補充&#xff0c;希望給感興趣的朋友進行了解。培訓內容主要包括基礎框架部分、MVC框架部分、Bootstrap框架部分、Bootstrap重要…