国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Looper Handler MessageQueue源碼解析

2019-11-09 17:52:03
字體:
供稿:網(wǎng)友

Looper Handler MessageQueue源碼解析

* class LooperThread extends Thread { * public Handler mHandler; * * public void run() { * Looper.PRepare(); * * mHandler = new Handler() { * public void handleMessage(Message msg) { * // process incoming messages here * } * }; * * Looper.loop(); * } * }

上邊為谷歌推薦的Handler使用方法,通過以上代碼 理解下Looper Handler MessageQueue相關(guān)代碼

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));//保證每個線程只有一個Looper對象 }

Looper與MessageQueue綁定:

private Looper(boolean quitAllowed) { //每個Looper唯一對應(yīng)一個MessageQueue 即一個線程對應(yīng)一個Looper 一個MessageQueue mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread(); }

Looper自循環(huán)

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; Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity(); for (;;) {//無線循環(huán) Message msg = queue.next(); // might block if (msg == null) { return; } msg.target.dispatchMessage(msg);//回調(diào)dispatchMessage方法 msg.recycleUnchecked(); } }

下面是Handler將消息添加到MessageQunue的流程:

boolean enqueueMessage(Message msg, long when) { synchronized (this) { if (mQuitting) { IllegalStateException e = new IllegalStateException(msg.target + " sending message to a Handler on a dead thread"); msg.recycle(); return false; } msg.markInUse(); msg.when = when; Message p = mMessages; boolean needWake; if (p == null || when == 0 || when < p.when) { msg.next = p; mMessages = msg; needWake = mBlocked; } else { needWake = mBlocked && p.target == null && msg.isAsynchronous(); Message prev; for (;;) { prev = p; p = p.next; if (p == null || when < p.when) { break; } if (needWake && p.isAsynchronous()) { needWake = false; } } msg.next = p; prev.next = msg; // 最后一個p為null 將message插入到倒數(shù)第二個位置 } if (needWake) { nativeWake(mPtr); } } return true; }

以上就是Looper Handler MessageQueue實(shí)現(xiàn)線程間通信的大致邏輯~


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 剑河县| 唐海县| 三明市| 广元市| 正阳县| 邳州市| 武川县| 丰都县| 珠海市| 平湖市| 阿拉善左旗| 和平区| 太原市| 通河县| 宜昌市| 绿春县| 新闻| 揭东县| 子长县| 中西区| 韶山市| 城口县| 肃南| 永平县| 云南省| 博罗县| 彭水| 洛扎县| 石狮市| 从江县| 双辽市| 隆尧县| 安龙县| 石城县| 合阳县| 山东省| 上蔡县| 蓬莱市| 汝州市| 桃园市| 扶余县|