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

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

從ActivityThread說起Handler相關的對象關系

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

在提到Handler的時候就不得不提到Looper、MessageQueue這兩個對象,到底這些對象和所謂的線程是什么關系呢?它們之間是如何聯系在一起的呢?又是如何做到發送消息的呢?這里就是要說明這三個問題的,如果你對這些問題也不能很好的回答出來,那就請繼續往下看。


這里的思路是從ActivityThread(也就是UI線程)的Looper對象開始,講這三個對象之間的關系。 首先看ActivityThread類的main方法:

// android.app.ActivityThread.javapublic static void main(String[] args) { ... // 前面省略若干 Looper.PRepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); ... // 中間省略若干 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited");}

這里在main方法中首先調用了Looper.prepareMainLooper()方法,然后在main方法的結尾調用了Looper.loop();這里我們先來看看Looper.prepareMainLooper()做了哪些操作。

// android.os.Looper.javapublic static void prepareMainLooper() { prepare(false); synchronized (Looper.class) { if (sMainLooper != null) { throw new IllegalStateException("The main Looper has already been prepared."); } sMainLooper = myLooper(); }}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方法其實就是創建了一個Looper對象,然后綁定到了ThreadLocal對象上,而ThreadLocal對象又是線程綁定的,因此,Looper對象也被綁定到了UI線程上面。然后繼續看Looper對構造方法:

// android.os.Looper.java private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread();}

可以看到在Looper的構造方法中創建了一個MessageQueue對象,至此,Looper、MessageQueue對象是如何關聯的已經很清楚了??偨Y一下,Thread會有一個ThreadLocal對象,ThreadLocal又持有一個Looper對象,Looper又持有一個MessageQueue對象。就是這樣。。。至少沒有我之前想象的復雜。 然而,Handler和它們是如何聯系起來的呢?這個問題我們還是先不去說,先來看Looper是如何處理消息的,這里來看Looper.loop()方法:

// android.os.Looper.javapublic static void loop() { final Looper me = myLooper(); final MessageQueue queue = me.mQueue; for (;;) { Message msg = queue.next(); // might block if (msg == null) { return; } try { msg.target.dispatchMessage(msg); } finally { msg.recycleUnchecked(); } }

這里省略很多無關的代碼,可以看到,當執行到Looper.loop()方法的時候,這里會進入一個死循環,MessageQueue.next()方法是阻塞式的,所以當有消息的時候就會立即處理,沒有消息的時候就會一直等待。 處理消息最終會調用到Message.target.dispatchMessage()方法,這里的target其實是一個Handler對象,所以最終處理消息是交給了Handler.diapatchMessage()方法去處理。

// android.os.Handler.javapublic void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); }}private static void handleCallback(Message message) { message.callback.run();}

這里的msg.callback其實是一個Runnable對象,如果存在的話,會直接調用它的run()方法。Handler.post()、Handler.postDelay()會最終調用到這里。 另外兩個調用也很明顯,如果Handler設置了CallBack對象,則會首先調用callback對象的handleMessage方法,如果該方法沒有消費掉(就是沒有返回true)Message對象,才會調用到Handler.handleMessage()方法。 說到這里,才開始說起Handler對象,通俗的講,Handler對象只是封裝了消息的發送和接收相關的方法。這里從創建Handler對象開始。當用戶從一個線程開始創建Handler對象的時候,會最終調用到這個構造方法:

// android.os.Handler.javapublic 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.prepare()"); } mQueue = mLooper.mQueue; mCallback = callback; mAsynchronous = async;}

看到這里,Handler對象在創建的時候會持有當前線程Looper和MessageQueue的引用,再看sendMessage,sendMessage會最終調用到

// android.os.Handler.javaprivate boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis);}

當添加到消息隊列后,就等待loop方法里面的訓話去處理吧。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性xxxxxxx| 日韩www在线| 91久久精品国产91久久性色| 亚洲国产精品人人爽夜夜爽| 日韩精品福利在线| 丁香五六月婷婷久久激情| 日韩精品视频免费| 欧美在线观看一区二区三区| 91精品国产高清久久久久久91| 国产99视频在线观看| 亚洲男人天天操| 亚洲欧美中文日韩在线| 久久99久久亚洲国产| 国产精品999999| 国产精品一区二区久久久| 黑人巨大精品欧美一区二区免费| 久久久综合免费视频| 午夜精品福利在线观看| 欧美人在线视频| 亚洲一区二区免费在线| 国产午夜精品视频| 综合网日日天干夜夜久久| 欧美激情一级欧美精品| 免费97视频在线精品国自产拍| 中文字幕综合一区| 亚洲欧美资源在线| 国产成人精品a视频一区www| 欧美日韩亚洲一区二区| 亚洲人成电影在线播放| 久久精品91久久香蕉加勒比| 亚洲精品影视在线观看| 日本乱人伦a精品| 国产精品一香蕉国产线看观看| 国产精品男女猛烈高潮激情| 亚洲欧美一区二区三区情侣bbw| 欧美福利在线观看| 98精品国产自产在线观看| 色综合视频网站| 在线日韩av观看| 亚洲一区美女视频在线观看免费| 亚洲桃花岛网站| 午夜精品一区二区三区av| 91国产美女在线观看| 欧美视频在线观看免费| 日韩成人在线视频| 91国产视频在线播放| 国产精品精品一区二区三区午夜版| 欧美性xxxxxxxxx| 国产精品jizz在线观看麻豆| 欧美性极品少妇精品网站| 国产在线视频不卡| 欧美一区在线直播| 国产精品美女主播在线观看纯欲| 久久久久久com| 国产精品视频一| 国产精品91在线| 国产福利视频一区| 成人激情视频网| 国产香蕉精品视频一区二区三区| 热久久免费国产视频| 国产亚洲精品美女久久久久| 美日韩精品视频免费看| 亚洲第一页在线| 久久精品99久久久久久久久| 久久久999精品| 欧美日韩国产综合新一区| 国产一区二区三区在线看| 91精品久久久久久久久久久| 欧美色道久久88综合亚洲精品| 欧美一级成年大片在线观看| 国产精品视频网| 亚洲www永久成人夜色| 亚洲欧美日韩中文在线制服| 日本三级韩国三级久久| 91久久久久久久久| 麻豆国产va免费精品高清在线| 欧亚精品在线观看| 欧美成人精品h版在线观看| 国产精品亚洲精品| 全亚洲最色的网站在线观看| 亚洲深夜福利在线| 久久成人18免费网站| 欧美激情中文字幕乱码免费| 亚洲bt天天射| 欧美激情一区二区三级高清视频| 亚洲欧美在线播放| 亚洲美腿欧美激情另类| 亚洲午夜精品久久久久久久久久久久| 成人免费高清完整版在线观看| 日本午夜精品理论片a级appf发布| 亚洲精品福利在线| 久久天天躁狠狠躁夜夜躁2014| 国产精品老女人视频| 欧美激情在线有限公司| 亚洲美女www午夜| 欧美视频在线视频| 欧美日韩亚洲视频一区| 一道本无吗dⅴd在线播放一区| 亚洲精品国产拍免费91在线| 国产v综合ⅴ日韩v欧美大片| 亚洲精品久久久久中文字幕欢迎你| 国产精品福利无圣光在线一区| 欧美在线视频观看| 国产视频亚洲视频| 欧美激情在线一区| 日韩欧美中文在线| 2024亚洲男人天堂| 不卡av日日日| 亚洲成人久久电影| 国产精品美女免费| 日韩欧美国产中文字幕| 精品激情国产视频| 国内精品国产三级国产在线专| 国产高清在线不卡| 国产精品情侣自拍| 国产精品九九久久久久久久| 亚洲欧美999| 久久综合伊人77777蜜臀| 久久综合网hezyo| 国产免费一区视频观看免费| 久久精品人人做人人爽| 综合网日日天干夜夜久久| 神马久久久久久| 久久精品色欧美aⅴ一区二区| 亚洲国产精品福利| 日韩欧美一区视频| 久久99国产综合精品女同| 欧美黑人性生活视频| 亚洲欧美日韩国产中文| 91精品国产91久久久久福利| 日韩69视频在线观看| 国产精品久久久一区| 草民午夜欧美限制a级福利片| 日本中文字幕成人| 日本亚洲欧洲色α| 日韩亚洲欧美成人| 尤物99国产成人精品视频| 国产视频综合在线| 亚洲精品一区二区网址| 亚洲精选在线观看| 国产乱肥老妇国产一区二| 国产亚洲精品91在线| 国产做受69高潮| 欧美激情xxxx性bbbb| 国产午夜精品久久久| 国产成人精品久久亚洲高清不卡| 日韩精品中文字幕久久臀| 日本中文字幕成人| 中文字幕欧美视频在线| 国产成人aa精品一区在线播放| 成人春色激情网| 日韩av在线免费| 久久精品国产一区| 亚洲 日韩 国产第一| 九九热这里只有精品6| 91高清视频免费观看| 91免费在线视频| 国产精品久久久久久久久久久新郎| 欧美电影免费观看高清完整| **欧美日韩vr在线| 亚洲男人的天堂在线| 欧美黑人一级爽快片淫片高清| 亚洲天堂av女优| 国产自摸综合网|