MessageQueue原始碼解析
MessageQueue
1.變數
12345678910111213141516 | private final boolean mQuitAllowed; //表示MessageQueue是否允許退出 @SuppressWarnings ( "unused" ) private long mPtr; //mPtr是native程式碼相關的 Message mMessages; //表示訊息佇列的頭Head private 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介面:
12345678910111213141516171819202122 | public 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裡的一個內部類,程式碼如下:
1234567 | final class GcIdler implements MessageQueue.IdleHandler { @Override public 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