Handler 消息机制

1.Handler

消息发送者和处理者

1.变量 Looper MessageQueue

2.发送消息:sendMessage(Message ,time) ,sendMessageAtTime(Message,long) 等方法 最终调用 MessageQueue的 enqueueMessage() 方法

3.处理消息 :dispatchMessage(Message msg)  如果 Message 中已经设置 Callback  则调用 handleCallback(msg) 如果Handler 设置了Callback  则调用了 callback.handleMessage()

2.Looper(消息轮询器)

1.初始化Looper  Looper.prepare()  , prepare()时会创建一个MessageQueue 同时 ThreadLocal 会使用一个键值对 将一个looper 绑定到与之相关联的线程中 ThreadLocal.set(new Looper(true)), 在ThreadLocal 可保存16对这样的键值对 ,当要使用looper时ThreadLocal.get()方法获取looper

2.Loope的r轮询  Looper.loop()  此时 可以通过当前的Looper对象获取MessageQueue  然后用for的死循环 调用messageQueue的 next方法 不断的取出Message  在通过message.taget.dispatchMessage(message) 处理消息

3.MessageQueue (消息队列)

1.enqueueMessage(message,time)  MessageQueue 是一个按时间排序单链表的数据结构来存储消息列表存放Message  当插入消息时不断访问 Message 的下一个指针 当该指针的Message执行时间小于time时 则插入该Message;

2.next()  for死循环从MessageQueue中获取消息,判断当前时间是否等于Message中的执行时间 如果小于Message中的执行时间 则 调用本地方法刷新等待时间


4.ThreadLocal

1.为了每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂性

2.使用ThreadLocal 可以 使当前线程对象与 Looper绑定,ThreadLocal 内部提供了一个ThreadLocalMap 内部类  ThreadLocalMap 提供了一个继承自弱引用的内部类的数组形式保存当前线程对象所对应的looper。

3.ThreadLocalMap 的Entry数组长度初始值为16,当执行resize方法时会对数组进行两倍扩容

4.ThreadLocal的值在table数组中的存储位置总是为ThreadLocal的reference字段所标识的对象的下一个位置,比如ThreadLocal的reference对象在table数组的索引为index,那么ThreadLocal的值在table数组中的索引就是index+1

总结:

Handler消息的发送者和处理者 线程中通过Looper.prepare() 获取Looper对象,通过该对象 就可以获取与之绑定的MessageQueue对象。当handler 不断地sendMessage时 当前的messageQueue对象就会执行enqueueMessage()方法将Message存入MessageQueue中,当Looper执行loop()方法时for()死循环不断从MessageQueue中取出消息,然后通过Message中的绑定的handler对象执行dispatchMessage方法 处理消息;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容