android handler 机制 很简单

1.android handler机制

handler机制,也就是android的异步消息处理机制。但是这个机制不仅仅是一个handler类来完成的。先总结性的给这个机制一些描述:

  1.每个一线程持有有且只有一个消息队列,而且每一个线程持有且一个Looper循环器取消息

  2.每个线程可以有多个hanlder实例,每个handler实例都可以往消息队列里发消息,handler可以处理自己发的消息或者一个Runnable对象。

3.handler与其发送的消息有绑定关系,消息队列里的消息是哪个handler发的,就由哪个handler处理。

4:如果一个handler在主线程创建,这个handler却可以在子线程发送消息到消息队列,这个消息队列运行在主线程,这个消息队列关联的Looper也在主线程,当在loop方法中执行handleMessage方法时,说明handleMessage执行在主线程,故handleMessage可以进行ui操作。

给一张流程图,感受下:

handler 机制


sendMessage

2.先给出这个机制的一些必须了解的类的概念

Message:用于封装消息的简单数据结构。里面包含消息的ID、数据对象、处理消息的Handler引用和Runnable等。

Handler:消息的发送者和最终消息处理者。

MessageQueue:消息队列,提供消息的添加、删除、获取等操作来管理消息队列。

Looper:用于建立消息循环并管理消息队列(MessageQueue),不停的从消息队列中抽取消息,分发下去并执行。

先了解下Message:

Message

很清晰的看到Message的成员变量 Handler target;说明创建的Message由这个Handler来处理,还有一个成员变量 Runnable callback;如果Message给这个callback设置了值,那么优先执行这个callback。

 上图没把源码截全面,其实Message类还有一个成员变量 Message next;可以在上图obtain方法中看出端倪。由于java不谈指针的概念,所以Message内部维护了一个Message类型的引用。所以Message类是链式存储的,从上图Message sPool也可以看出。我们可以从sPool中取出(获得)一个Message对象。

其实可以理解为MessageQueue中只有一个Message对象,因为Message链式存储,一个Message对象也能找到链条的下一个Message。

MessageQueue主要实现Message对象进出以及销毁队列的功能,不再详述。

Looper这个类有必要讲一下:主要功能是分发Message:贴源码:

Looper

着重看下Looper类的loop方法,在loop方法中一直遍历MessageQueue中的消息,然后通过取到的消息中的target,也就是创建该消息的Handler,通过target的处理消息方法处理该消息,那么我们看这个处理消息函数的源码。


处理消息

最后来看看handler是如何构造出来,如何发送消息到消息队列,再如何从消息队列取出消息处理的。

先看构造handler类的构造函数吧


构造函数

handler必须有looper类的引用,有了looper类的引用,自然与looper类关联的MessageQueue有引用关系。

聊聊handler如何发送消息,仔细查看源码,发现发送消息都由如下函数执行:


sendmessage

该方法就是调用MessageQueue的enqueueMessage(…)方法将指定的Message插入到消息队列中去,即加入Message链,并指明何时应该从消息队列中取出来执行。其中uptimeMillis就是绝对时间戳,uptimeMillis = current time + delayMillis。

postXXX系列函数来说,需要指定一个Runnable对象,在合适的时间执行。

实际上,他们最终调用的还是sendMessageAtTime函数,只不过中间多了一步,即根据Runnable创建Message对象。只不过该消息中包含了一个Runnable对象。消息的处理是在loop方法中运行的,不再详述。

总结:

在主线程创建的handler,当子线程完成某个具体的任务或者逻辑,在子线程中发送消息给消息队列,当处理该消息时,是在主线程中进行ui操作。这就完成了主线程和子线程的通信。这是handler机制的最正宗的用途。

当然每个线程都可以拥有一个完整的handler机制,开发者可以根据具体需求去使用,修改这个机制,但是终究是为了完成线程间通信的目的不会变。

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

推荐阅读更多精彩内容