日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

关于Android消息机制你所需要知道的

發布時間:2025/4/5 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Android消息机制你所需要知道的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?Android的消息機制幾乎是面試必問的話題,當然也并不是因為面試,而去學習,更重要的是它在Android的開發中是必不可少的,占著舉足輕重的地位,所以弄懂它是很有必要的。下面就來說說最基本的東西。

Looper

作用:

  • 關聯起Thread
  • 循環取出消息

1、Looper是否可以直接實例化?

Looper構造方法是私有的,其中做了兩件事

  • 創建一個MessageQueue
  • 得到與之對應的Thread
private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread(); }

2、一個線程能對應多個Lopper?

不能,一個線程對應一個Looper對象,通過ThreadLocal保證一個線程只有一個Looper與之對應,如果多次調用Looper.prepare();則會拋出運行時異常。

private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { // 查看是否有looper與當前線程對應 throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); }

3、Looper是無限循環,會阻塞嗎?

是,當開啟一個loop后是一個死循環,從MessageQueue中取出消息,處理消息,但是也有可能退出,在沒有消息后退出循環。

public static void loop() { final Looper me = myLooper(); if (me == null) { throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread."); } final MessageQueue queue = me.mQueue; // 略 for (;;) { Message msg = queue.next(); // might block if (msg == null) { // 當沒有消息的時候,退出 // No message indicates that the message queue is quitting. return; } // 略 msg.target.dispatchMessage(msg); }

4、可以再次調用Looper.prepareMainLooper嗎?

不可以,Looper.prepareMainLooper最終也是調用prepare(),同2.

public static void prepareMainLooper() { prepare(false); // 創建一個Looper synchronized (Looper.class) { if (sMainLooper != null) { throw new IllegalStateException("The main Looper has already been prepared."); } sMainLooper = myLooper(); } }

5、MainLooper什么時候創建的?

MainLooper是啟動Activity創建ActivityThread(并不是一個Thread)時候創建,所以不能多次創建。

public static void main(String[] args) { // 略 Process.setArgV0("<pre-initialized>"); Looper.prepareMainLooper(); // 略 ActivityThread thread = new ActivityThread(); thread.attach(false); // 略 if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } // 略 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); } }

Handler

作用:

  • 發送消息到MessageQueue
  • 處理消息

1、Handler如何與Looper、MessageQueue關聯起來?

我們知道一個Looper對應一個Thread,一個Looper包含一個MessageQueue。當我們創建Handler時就會從當前線程中取出與之對應的Looper,讓后在從Looper中取出MessageQueue。

// 1、自動獲取 public Handler(Callback callback, boolean async) { // 略 mLooper = Looper.myLooper(); // 取出當前線程中的Looper if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; // 取出MessageQueue mCallback = callback; mAsynchronous = async; } // 2、傳遞一個Looper進來 public Handler(Looper looper, Callback callback, boolean async) { mLooper = looper; mQueue = looper.mQueue; mCallback = callback; mAsynchronous = async; }

Message

單項鏈表結構。

作用:

  • 數據的載體

1、消息如何復用的?

從全局消息池(鏈表結構)中

public static Message obtain() { synchronized (sPoolSync) { if (sPool != null) { Message m = sPool; sPool = m.next; m.next = null; m.flags = 0; // clear in-use flag sPoolSize--; return m; } } return new Message(); }

2、Message為什么能傳遞?

Android中想要傳遞對象要么實現Serializable要么Parcelable,在這里是實現了Parcelable接口。

public final class Message implements Parcelable { // 略 }

3、如何與Handler關聯?

我們知道在消息傳機制中Handler充當著“快遞員”的角色,那么他又是如何與“貨物”--Message發生關系呢?實際上Message有一個成員變量target他的類型正是Handler,

/*package*/ Runnable callback; public int arg1; public int arg2; public Object obj; /*package*/ Handler target; // 關鍵點

當我們通過Handler去send一個Message時候最終都會為target賦值為this,即當前的Handler。

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

另為如果是通過Message.Obtain(),獲取的復用Message也會為其賦值。

多說一句,Handler.obtainMessage()調用的就是Message.Obtain()。

public final Message obtainMessage(){ return Message.obtain(this); }

總結:

通過一系列的包涵關系,最終Looper、Handler、Message、MessageQueue即發生關聯,從而形成一個閉合,開啟消息循環。

困惑

最近一直在看這方面的知識,但是能力有限,還是有不少困惑,如果有錯誤,或你理解下面的問題請聯系我fvaryu@qq.com,愿與君交流學習,謝謝

1、Message中的sPool,哪里初始化的?為什么Message.obtain()中不會拋異常?

2、ActivityThread并不是線程,為什么可以創建一個Looper,Main Thread什么時候創建?

3、為什么序列化了的對象就可以傳遞?與Binder有關?

4、MessageQueue對應的是NativeMessageQueue,具體實現需要學習?

5、Loop.loop(),會退出嗎?退出時機是什么?如果會退出,那么主線程同樣會退出嗎?

總結

以上是生活随笔為你收集整理的关于Android消息机制你所需要知道的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级大片免费观看 | 美女网站免费观看视频 | 成人久草 | 我的公把我弄高潮了视频 | 影音先锋色小姐 | 美女被猛网站 | 成人毛片100免费观看 | 网址av | 色在线视频观看 | 天天干夜夜骑 | 秋霞精品一区二区三区 | 成年人看的视频网站 | 国产精品久久久精品三级 | 欧美视频在线免费看 | 一本加勒比hezyo黑人 | 久久久最新 | 日韩一级片免费看 | 久久精彩视频 | 亚洲男女视频 | 成人在线中文字幕 | 日韩视频一区二区 | 色先锋资源网 | 婷婷视频一区二区三区 | 精品精品精品 | 色呦呦呦呦 | 日韩国产三级 | 日韩欧美网站 | 少妇人妻一区二区三区 | 日韩成人一区二区视频 | www日本高清 | 国产一区二区视频在线播放 | 女生脱裤子让男生捅 | xxxxx毛片 | 97色在线| 超碰在线公开 | www一区 | 欧美视频第一页 | 中文字幕理伦片免费看 | 禁欲天堂 | 久久国语精品 | 夜夜精品一区二区无码 | 亚洲一区在线视频观看 | 制服丝袜手机在线 | 午夜肉体高潮免费毛片 | 国产人成无码视频在线观看 | 女人扒开腿让男人桶爽 | 一区二区三区国产av | 免费在线观看高清影视网站 | 7799精品视频| 日本不卡一区在线 | 久久99精品波多结衣一区 | www欧美在线| 日本精品在线观看视频 | 国产在线观看一区二区三区 | 囯产精品一品二区三区 | 国产午夜精品免费一区二区三区视频 | 调教撅屁股啪调教打臀缝av | 又黄又爽一区二区三区 | 欧美一级欧美三级在线观看 | 91麻豆精品国产91久久久久久 | 草草影院一区二区三区 | a级一级片 | 免费一级特黄特色毛片久久看 | 在线免费日韩av | 日韩精品在线观看免费 | 欧美性猛交69 | 亚洲一区二区三区久久久成人动漫 | 成人tv| 久久久久久久久国产精品一区 | 波多野结衣视频在线观看 | 狠狠婷 | 婷婷伊人综合 | 毛片在线免费观看网址 | 日韩视频免费观看高清 | 人人射人人 | 婚后打屁股高h1v1调教 | av中文天堂在线 | 中文字幕在线网 | 欧美黄色录像视频 | 奇米影视第4色 | 久久成人综合 | 国产午夜精品久久久久 | 欧美日韩一区二区视频在线观看 | 欧美日本不卡 | 男男play呻吟动漫网站 | 二级毛片视频 | 久久综合第一页 | 毛片黄片免费看 | 一区二区日韩视频 | 欧美日韩在线免费视频 | 图书馆的女友在线观看 | 色老板精品凹凸在线视频观看 | 欧美日韩乱 | 午夜大片 | 欧美乱码精品 | 天天躁日日躁狠狠躁av | 国产第九页 | 国产激情视频在线播放 | 男生操女生网站 |