亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Handler,MessageQueue,Looper

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

深入理解Handler,MessageQueue,Looper 轉:http://www.jianshu.com/p/6d143b8c15ee 前言: 其實講 Handler 內部機制的博客已經很多了,但是自己還是要在看一遍,源碼是最好的資料。在具體看源碼之前,有必要先理解一下 Handler、Looper、MessageQueue 以及 Message 他們的關系。 Looper: 是一個消息輪訓器,他有一個叫 loop() 的方法,用于啟動一個循環,不停的去輪詢消息池 MessageQueue: 就是上面說到的消息池 Handler: 用于發送消息,和處理消息 Message: 一個消息對象

源碼分析開始: 一切要從Handler的構造函數開始講起

public Handler(Callback callback, boolean async) { mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.我們可以看到,Handler定義了一個MessageQueue對象mQueue和一個Looper對象mLooper。順著源碼繼續往下看,跳轉到Looper.myLooper()方法。

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();public static @Nullable Looper myLooper() { return sThreadLocal.get();}

這里涉及了ThreadLocal,暫時不講。通過ThreadLocal的get方法獲取Looper并返回。那么問題來了?我們只看到了get,并沒有看到set。如果沒有set的話,get出來就會為null,通過Handler的構造函數我們知道,mLooper==null會拋出異常。而我們在使用Handler的過程中并沒有遇到該異常。那問題來了,到底在哪里進行了set呢?通過對Looper源碼搜索發現,改方法進行set操作:

private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed));}

可以看到在prepare()方法中進行了set操作,那么問題又來了,哪里調用了該方法呢?因為prepare方法是私有方法,所以肯定是本類中調用,通過搜索發現以下方法調用了prepare()方法:

* Initialize the current thread as a looper, marking it as an *
application's main looper. The main looper for your application * is created by the Android environment, so you should never need * to call this function yourself. See also: {@link #prepare()} */public static void prepareMainLooper() { prepare(false); synchronized (Looper.class) { if (sMainLooper != null) { throw new IllegalStateException("The main Looper has already been prepared."); } sMainLooper = myLooper(); }}

那一切就是順利成章了。到這里,有人又會問,那這個方法又是誰調用的呢?看注釋發現,該方法在啟動app的時候就已經調用了。具體是在ActivityThread的main方法中啟動。 到這里為止,我們了解了Handler,Looper的初始化相關知識。接下來,我們需要了解的是如何進行發送和處理Message。 發送Message代碼如下:

public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); return false; } return enqueueMessage(queue, msg, uptimeMillis);}

這個方法我們主要是看enqueueMessage():

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis);}

這里關鍵的是看懂msg.target = this;msg就是Message的對象,那么看Message源碼發現,它的target屬性是Handler target;那么,為什么發送消息的時候需要將this(當前Handler對象)帶過去呢?咋們暫且繼續… 這個方法實際執行的還是queue.enqueueMessage(),我們找到MessageQueue類的相關方法,發現以下代碼 msg.next = p; // invariant: p == prev.next prev.next = msg; 通過這兩行代碼我們發現,MessageQueue并不是隊列,而是單鏈表。所以下次面試的時候,如果你支出handler的消息隊列其實是利用Message的單鏈表實現的肯定能加分的。 到此,發送消息已經講完了。下面我們看看處理消息是怎樣進行的呢?我們知道,Loope會從MessageQueue中不斷拿消息,我們看看Looper.loop()代碼:

public static void loop() { for (;;) { Message msg = queue.next(); // might block if (msg == null) { // No message indicates that the message queue is quitting. return; } msg.target.dispatchMessage(msg); msg.recycleUnchecked(); }}

這里取出消息并分發之。是不是有頓悟的感覺,回到上面我們遺留的問題:msg.target = this,將this傳遞過去,言外之意就是哪個Handler發送的消息就由哪個Handler進行處理。那么我們來看看Handler的dispatchMessage 方法:

public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); }}

終于見到我們最常見的handleMessage()了。他首先判斷 Message 對象的 callback 對象是不是為空,如果不為空,就直接調用 handleCallback 方法,并把 msg 對象傳遞過去,這樣消息就被處理了,我們來看 Message 的 handleCallback 方法

private static void handleCallback(Message message) { message.callback.run();}

沒什么好說的了,直接調用 Handler post 的 Runnable 對象的 run() 方法。 如果在發送消息時,我們沒有給 Message 設置 callback 對象,那么程序會執行到 else 語句塊,此時首先判斷 Handler 的 mCallBack 對象是不是空的,如果不為空,直接調用 mCallback 的 handleMessage 方法進行消息處理。最終,只有當 Handler 的 mCallback 對象為空,才會執行自己的 handleMessage 方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线一区| 国产一区二区三区精品久久久| 亚洲视频综合网| 91精品久久久久久综合乱菊| 久久久久久久久久久网站| 91国产在线精品| 亚洲男人天堂网站| 精品国产乱码久久久久久婷婷| www.欧美免费| 欧美国产第二页| 久久天天躁夜夜躁狠狠躁2022| 精品久久香蕉国产线看观看亚洲| 欧美成人在线免费| 日韩一二三在线视频播| 国产91在线高潮白浆在线观看| 国内精品中文字幕| 久久久久久久久久久免费精品| 久久国产精品影片| 中文字幕日韩高清| 精品亚洲国产视频| 在线视频免费一区二区| 中文日韩在线观看| 国产精品免费久久久| 日韩中文在线中文网在线观看| 国产精品成人av在线| 久久久久久久久亚洲| 69国产精品成人在线播放| 亚洲成色777777女色窝| 成人久久一区二区三区| 亚洲影院色在线观看免费| 久久久国产精品视频| 亚洲色图18p| 性色av一区二区三区免费| 亚洲人成在线观看| 欧美极品在线视频| 美日韩精品免费视频| 国产午夜精品一区理论片飘花| 亚洲精品视频播放| 亚洲欧美精品伊人久久| 青草青草久热精品视频在线观看| 日本成人精品在线| 福利视频导航一区| 日本一区二区三区四区视频| 91在线观看免费| 欧美精品18videosex性欧美| 久久久免费高清电视剧观看| 欧美日本高清一区| 91成人精品网站| 欧美色图在线视频| 自拍亚洲一区欧美另类| 一区二区三区视频观看| 成人h片在线播放免费网站| 久久精品久久精品亚洲人| 97av在线视频免费播放| 中文字幕av一区| 亚洲欧美日韩精品久久奇米色影视| 精品五月天久久| 成人国产亚洲精品a区天堂华泰| www欧美日韩| 国产日韩中文字幕在线| 永久免费精品影视网站| 在线日韩中文字幕| 亚洲天堂开心观看| 国产91av在线| 欧美日韩在线视频一区| 亚洲男人的天堂在线播放| 91精品久久久久久久久不口人| 亚洲无线码在线一区观看| 亚洲国产精彩中文乱码av在线播放| 奇米一区二区三区四区久久| 欧美亚洲第一区| 欧美激情2020午夜免费观看| 国产91|九色| 国产精品第2页| 国产精品2018| 亚洲成av人片在线观看香蕉| 国内精品在线一区| 青草热久免费精品视频| 久久精品国产欧美激情| 欧美成人免费视频| 日韩亚洲成人av在线| 777午夜精品福利在线观看| 日韩国产欧美精品在线| 亚洲一级一级97网| 精品精品国产国产自在线| 日本高清久久天堂| 91免费在线视频| 欧美性色视频在线| 日韩激情av在线免费观看| 国产精品久久久久久亚洲影视| 日韩中文字幕国产精品| 欧美性高潮床叫视频| 欧美最猛性xxxxx(亚洲精品)| 久久久久五月天| 91国产精品视频在线| 亚洲国产精品999| 91国产精品91| 久青草国产97香蕉在线视频| 国产高清视频一区三区| 国产精品久久久久aaaa九色| 在线播放国产精品| 久久精品这里热有精品| 中文字幕亚洲一区二区三区五十路| 全色精品综合影院| 欧美一级高清免费| 亚洲第一区在线| 亚洲精品美女在线| 日本精品一区二区三区在线| 欧美性受xxxx白人性爽| 欧美成人sm免费视频| 按摩亚洲人久久| 国产乱人伦真实精品视频| 国产精品99导航| 国产不卡精品视男人的天堂| 黑人巨大精品欧美一区二区三区| 国产亚洲一区二区在线| 亚洲伊人一本大道中文字幕| 亚洲高清一二三区| 久久久亚洲国产天美传媒修理工| 亚洲性69xxxbbb| 91国产精品91| 国产精品第一第二| 亚洲综合小说区| 国产精品一区二区3区| 国产主播喷水一区二区| 亚洲人高潮女人毛茸茸| 欧美在线视频一区| 日韩av综合网| 亚洲国产成人精品久久久国产成人一区| 欧美性猛交xxxx免费看| 日本成人免费在线| 久久91亚洲人成电影网站| 美日韩精品免费观看视频| 国内外成人免费激情在线视频| 中文字幕亚洲天堂| 2021国产精品视频| 77777少妇光屁股久久一区| 日本高清视频精品| 国产成人精品久久二区二区| 国产精品av电影| 亚洲自拍欧美色图| 欧美电影在线免费观看网站| 国产精品视频成人| 亚洲国产精品高清久久久| 成人在线视频福利| 国产成人在线视频| 97久久久久久| 国产专区精品视频| 97人人模人人爽人人喊中文字| 亚洲美女又黄又爽在线观看| 日韩精品视频三区| 国产精品亚洲综合天堂夜夜| 久久视频免费观看| 欧美色播在线播放| xvideos亚洲| 欧美野外猛男的大粗鳮| 亚洲国产精品专区久久| 日韩在线播放视频| 欧洲成人在线观看| 国产91精品黑色丝袜高跟鞋| 俺去了亚洲欧美日韩| www.欧美免费| 亚洲字幕在线观看| www.亚洲一区|