1. 程式人生 > >MessageQueue原始碼解析

MessageQueue原始碼解析

MessageQueue

1.變數

12345678910111213141516private final boolean mQuitAllowed;//表示MessageQueue是否允許退出@SuppressWarnings("unused")private long mPtr; //mPtr是native程式碼相關的Message mMessages; //表示訊息佇列的頭Headprivate final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>();private SparseArray<FileDescriptorRecord> mFileDescriptorRecords;
private IdleHandler[] mPendingIdleHandlers;private boolean mQuitting;// Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout.private boolean mBlocked;// The next barrier token.// Barriers are indicated by messages with a null target whose arg1 field carries the token.private int
 mNextBarrierToken; 

mQuitAllowed表示MessageQueue是否允許退出,系統建立的UI執行緒的MessageQueue是不允許的,其他客戶端程式碼建立的都是允許的;

mPtr是native程式碼相關的,指向C/C++程式碼中的某些物件(指標),其他一些nativeXXX()相關的函式本文暫不做分析;

mMessages表示訊息佇列的頭Head;

mIdleHandlers是IdldHandler介面的ArrayList, mPendingIdleHandlers是陣列版本,在後面的程式碼中會將ArrayList的內容拷貝到它裡面;

mQuitting表示當前佇列是否處於正在退出狀態;

mBlocked表示next()呼叫是否被block在timeout不為0的pollOnce上;

mNextBarrierToken表示下一個barrier token,barrier用target==null, arg1==token的Message物件表示;

IdleHandler callback介面:

12345678910111213141516171819202122public static interface IdleHandler {/*** Called when the message queue has run out of messages and will now* wait for more.  Return true to keep your idle handler active, false* to have it removed.  This may be called if there are still messages* pending in the queue, but they are all scheduled to be dispatched* after the current time.*/boolean queueIdle();}public void addIdleHandler(IdleHandler handler) {if (handler == null) {throw new NullPointerException("Can't add a null IdleHandler");}synchronized (this) {mIdleHandlers.add(handler);}}public void removeIdleHandler(IdleHandler handler) {synchronized (this) {mIdleHandlers.remove(handler);} 

IdleHandler介面表示當MessageQueue發現當前沒有更多訊息可以處理的時候則順便乾點別的事情的callback函式(即如果發現idle了,

那就找點別的事幹)。callback函式有個boolean的返回值,表示是否keep。如果返回false,則它會在呼叫完畢之後從mIdleHandlers

中移除。這裡讓我們來看一個具體的例子(實現),ActivityThread.java裡的一個內部類,程式碼如下:

1234567final class GcIdler implements MessageQueue.IdleHandler {@Overridepublic final boolean queueIdle() {doGcIfNeeded();return false;}} 

這是一個gc相關的IdleHandler,即如果沒有更多的訊息可以處理就會抽空doGcIfNeeded(),最後返回false表示不保留在mIdleHandlers

相關推薦

android Handler、Looper、Messsage、MessageQueue原始碼解析

Handler:傳送和接收訊息 Looper:訊息(迴圈)輪詢器 Message:訊息池 MessageQueue:訊息佇列。雖然名為佇列,但事實上它的內部儲存結構並不是真正的佇列,而是採用單鏈表的資料結構來儲存訊息列表的 先來看Handler,其實系統很多東西都是通過Handler訊息

Handler,Message,Looper,MessageQueue原始碼解析

好久不看原始碼了,心生畏懼,所以這一週抽出時間來看看Handler相關原始碼 感謝下面幾位博主的部落格 我們是如何使用Handler的? public class HandlerActivity extends AppCompatActivity {

MessageQueue原始碼解析

MessageQueue1.變數12345678910111213141516private final boolean mQuitAllowed;//表示MessageQueue是否允許退出@SuppressWarnings("unused")private long mP

Netty進階:Futrue&Promise原始碼解析

文章目錄 1. Future&Promise 2. AbstractFuture 3.Completefuture 4.Channelfuture&Completechannel

大資料基礎(1)zookeeper原始碼解析

五 原始碼解析   public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING;}zookeeper伺服器狀態:剛啟動LOOKING,follower是FOLLOWING,leader是LEADING,observer是

Android框架原始碼解析之(四)Picasso

這次要分析的原始碼是 Picasso 2.5.2 ,四年前的版本,用eclipse寫的,但不影響這次我們對其原始碼的分析 地址:https://github.com/square/picasso/tree/picasso-parent-2.5.2 Picasso的簡單使用

Android框架原始碼解析之(三)ButterKnife

注:所有分析基於butterknife:8.4.0 原始碼目錄:https://github.com/JakeWharton/butterknife 其中最主要的3個模組是: Butterknife註解處理器https://github.com/JakeWharton/

Android框架原始碼解析之(二)OKhttp

原始碼在:https://github.com/square/okhttp 包實在是太多了,OKhttp核心在這塊https://github.com/square/okhttp/tree/master/okhttp 直接匯入Android Studio中即可。 基本使用:

Android框架原始碼解析之(一)Volley

前幾天面試CVTE,HR面掛了。讓內部一個學長幫我查看了一下面試官評價,發現二面面試官的評價如下: 廣度OK,但缺乏深究能力,深度與實踐不足 原始碼:只能說流程,細節程式碼不清楚,retrofit和volley都是。 感覺自己一方面:自己面試技巧有待提高吧(框

HashMap原始碼解析(JDK8)

前言 這段時間有空,專門填補了下基礎,把常用的ArrayList、LinkedList、HashMap、LinkedHashMap、LruCache原始碼看了一遍,List相對比較簡單就不單獨介紹了,Map準備用兩篇的篇幅,分別介紹HashMap和(LruCache+LinkedHa

原始碼解析--Long、long型別的比較遇到的問題

Long、long型別的比較遇到的問題: 1、long 是基本型別 Long是物件型別。 public static void main(String[] args) { Long A = 127l; Long B = 127l; long C = 127; l

CopyOnWriteArrayList實現原理以及原始碼解析

CopyOnWriteArrayList實現原理以及原始碼解析 1、CopyOnWrite容器(併發容器) Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。 其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才

LinkedList實現原理以及原始碼解析(1.7)

LinkedList實現原理以及原始碼解析(1.7) 在1.7之後,oracle將LinkedList做了一些優化, 將1.6中的環形結構優化為了直線型了連結串列結構。 1、LinkedList定義: public class LinkedList<E>

ArrayList實現原理以及原始碼解析(補充JDK1.7,1.8)

ArrayList實現原理以及原始碼解析(補充JDK1.7,1.8) ArrayList的基本知識在上一節已經討論過,這節主要看ArrayList在JDK1.6到1.8的一些實現變化。 JDK版本不一樣,ArrayList類的原始碼也不一樣。 1、ArrayList類結構:

ArrayList實現原理以及原始碼解析(JDK1.6)

ArrayList實現原理以及原始碼解析(JDK1.6) 1、ArrayList ArrayList是基於陣列實現的,是一個動態陣列,其容量能自動增長,類似於C語言中的動態申請記憶體,動態增長記憶體。 ArrayList不是執行緒安全的,只能用在單執行緒環境下。

ConcurrentHashMap實現原理以及原始碼解析

ConcurrentHashMap實現原理以及原始碼解析 ConcurrentHashMap是Java1.5中引用的一個執行緒安全的支援高併發的HashMap集合類。 1、執行緒不安全的HashMap 因為多執行緒環境下,使用Hashmap進行put操作會引起死迴圈

Java併發程式設計高階技術-高效能併發框架原始碼解析與實戰(資源同步)

第1章 課程介紹(Java併發程式設計進階課程) 什麼是Disruptor?它一個高效能的非同步處理框架,號稱“單執行緒每秒可處理600W個訂單”的神器,本課程目標:徹底精通一個如此優秀的開源框架,面試秒殺面試官。本章會帶領小夥伴們先了解課程大綱與重點,然後模擬千萬,億級資料進行壓力測試。讓大

PackageManagerService 原始碼解析

一.SystemServer建立PackageManagerService     省略 二.PackageManagerService 建構函式  2.1 Settings mSettings = new Settings(mPacka

Java中compareTo用法及原始碼解析

最近遇到一個問題,在日期比較的時候,很麻煩,因為日期比較沒有大於等於,只有大於或者小於,這就導致在比較時間的時候特別麻煩,而且還要由string轉成date格式才能比較,下面是我使用compareTo比較時間字串的程式碼: String putStartTime = Date

大資料基礎之Quartz(1)簡介、原始碼解析

一簡介 官網 http://www.quartz-scheduler.org/ What is the Quartz Job Scheduling Library? Quartz is a richly featured, open source job scheduling libra