国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Handler發送消息后消息隊列的處理

2019-11-09 14:35:27
字體:
來源:轉載
供稿:網友

在Android中使用Handler不僅可以直接post發送消息,還可以通過postDelayed設定延遲時間,來延遲執行消息任務。那么這后面的機制是如何處理的呢?

首先查看Handler的源碼,會發現postpostDelayed內部均調用的同一方法sendMessageDelayed

public final boolean post(Runnable r){ return sendMessageDelayed(getPostMessage(r), 0);}public final boolean postDelayed(Runnable r, long delayMillis){ return sendMessageDelayed(getPostMessage(r), delayMillis);}

在這里的不同是當調用post時,延遲時間傳入的是0。

下一步,sendMessageDelayed中:

public final boolean sendMessageDelayed(Message msg, long delayMillis){ if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);}

將小于0的異常延遲時間置為0,接下來將延遲時間與SystemClock.uptimeMillis()相加,最終調用sendMessageAtTime。 這一步的時間轉換,將延遲時間這個相對值,轉化為了系統啟動后的一個絕對值時間,之后framework中的處理均是在絕對值上進行比較。

再繼續追蹤源碼,handler最終會調用MessageQueue中的方法,將消息添加到隊列中:

PRivate boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); // 添加到消息隊列}

進一步分析MessageQueue中的enqueueMessage方法,代碼比較長,但是邏輯不復雜,添加到隊列的代碼主要是這一部分:

boolean enqueueMessage(Message msg, long when) { // ... synchronized (this) { // ... msg.markInUse(); msg.when = when; Message p = mMessages; boolean needWake; if (p == null || when == 0 || when < p.when) { // 將消息添加到隊列開始 // New head, wake up the event queue if blocked. msg.next = p; mMessages = msg; needWake = mBlocked; } else { // 將消息添加到隊列中間某處 // Inserted within the middle of the queue. Usually we don't have to wake // up the event queue unless there is a barrier at the head of the queue // and the message is the earliest asynchronous message in the queue. needWake = mBlocked && p.target == null && msg.isAsynchronous(); // 一個典型的鏈表插入節點方法 Message prev; for (;;) { prev = p; p = p.next; if (p == null || when < p.when) { break; } if (needWake && p.isAsynchronous()) { needWake = false; } } msg.next = p; // invariant: p == prev.next prev.next = msg; } // We can assume mPtr != 0 because mQuitting is false. if (needWake) { nativeWake(mPtr); } } return true;}

1.在消息對象msg中包含一個when變量,保存的就是該消息應執行的時間(剛才轉化后的絕對值時間)。 2.mMessagesMessageQueue類中的一個全局變量,指向的是消息隊列中的頭節點。因此我們看到判斷邏輯前,先將mMessages引用賦值給了變量p。 3.接下來,若消息隊列中沒有任何消息(p=null),或絕對時間為0,亦或這條消息執行時間在當前隊列第一條消息之前,那么將這條消息添加到隊列開始的位置; 不滿足這些條件時,用一個很典型的鏈表插入算法,將消息按時間順序添加到列表中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 招远市| 两当县| 常宁市| 毕节市| 昌黎县| 商都县| 马关县| 衡南县| 泾源县| 无棣县| 闻喜县| 景泰县| 上饶县| 谢通门县| 阳江市| 外汇| 新巴尔虎左旗| 浮山县| 本溪市| 平罗县| 纳雍县| 广宁县| 德昌县| 石渠县| 凤凰县| 安徽省| 安吉县| 汾西县| 三明市| 寻甸| 渑池县| 葫芦岛市| 密山市| 天等县| 元朗区| 巴楚县| 米林县| 陇川县| 昭平县| 科技| 潍坊市|