android的消息处理机制

来源:互联网 发布:期货套利 知乎 编辑:程序博客网 时间:2024/05/16 23:43


(一)初创


老张已过而立之年,踌躇满志,渴望浪迹互联网的英雄豪情始终在内心澎湃,终于,他走出了这一步,成立了一家互联网公司。

老张凭借着这几年在互联网领域的积累和个人魅力,很快就组建了一个技术团队,作为技术出身的老张很重视公司的技术发展,因此重金请来了一位技术总监,关于技术方面的工作,老张和CTO事必躬亲。于是,形成了这样一种组织架构:


老张的团队

在这样组织架构中,老张为每个职能的定位和要求是这样子的:

自己(UI-Thread):负责融资、战略、在互联网上撕逼、公司管理等,全身心投入公司,并尽可能挤出时间陪伴老婆孩子。

技术总监(Handler):所有技术、产品层面的事情都必须经过技术总监,并且向老张做最后的汇报。

助理小怡(Looper):负责汇集一线工作人员的吃喝拉撒等所有消息的汇总,并井然有序的传达给技术总监。

程序猿、产品汪、设计喵、攻城狮(Thread):这是一群偏执、精益求精的怪物,在各自专业领域都能独当一面,可谓八仙过海,各显神通。以下简称攻城狮们。

(二)1+1>2


一个合理的组织架构,简单明了的分工和人际关系是最适合技术团队的。公司成立之初,员工们各司其职,公司一片祥和,每个人在自己的专业领域里大放异彩。

助理小怡(Looper)


首先,老张为技术总监精挑细选,选拔了一名聪明伶俐,任劳任怨的助理小怡。

助理小怡的工作内容主要有两件事情,第一件事情是做好准备工作(Looper.prepare()),即到某宝上包邮购买了一个消息盒子(MessageQueue),用来收集攻城狮们(Thread)的各种诉求(Message)。第二件事情是开启无限循环的工作模式(Looper.loop()),她无比勤劳的等待着攻城狮们的各种召唤,收集他们的诉求,并传达给技术总监。让我们来看下她是怎么做到的:

首先是prepare(),如下:


Looper.prepare()源码

其次是loop(),如下:


Looper.loop()源码

Looper做好了这两件事,很好的充当了Handler和Message之间的桥梁。


技术总监(Handler)


有助理小怡这样的贴心小棉袄,技术总监的工作轻松了不少。

助理Looper在loop()中通过msg.target.dispatchMessage(msg)将消息分发给技术总监Handler,那么Handler将如何对这些Message进行处理,我们来看下dispatchMessage的源代码:


Handler.dispatchMessage(Message)

由此我们得知:为什么我们在主线程中实例化Handler的时候需要重写handleMessage()。


攻城狮们(Thread)永不安分的需求(Message)


程序猿、产品汪、设计喵、攻城狮是时候登场了,这些角色是公司重要的财富,他们对技术狂热而执着,对产品敬畏而精益求精,他们犹如数台高性能的计算机,高并发的运作着,为公司创造着财富。在日常工作中,他们通常有很多技术上的问题和产品上的想法需要与技术总监进行沟通,如下代码:


子线程与主线程的交互

这样的代码平常见太多了,这里不做赘述,输出结果将是:

日理万机的CTO(默认显示)

处理Coder的需求:将安排人员排查性能问题(2s后显示)

处理PM的需求:开发人员全体加班,严格执行996(5s后显示)


CEO老张(UI-Thread)


这样的组织架构下,各职能部门确实能井然有序的进行着工作,但是彼此之间是怎么进行配合的,还需要CEO老张亲自来解答以下几个问题:

1.助理从哪里来,何时开始工作(Looper何时实例化,Looper.prepare()和Looper.loop()何时调用)?

关于这个问题,得从最初老张决定创建公司的时候说起,答案在ActivityThread中。


Android程序入口

2.老张是何时为CTO(Handler)分配助理(Looper)的?

其实在老张重金请来CTO的时候,已经为他分配好助理了,如下图,在Handler的构造器中:


Handler与Looper建立关联

3.助理(Looper)如何收集攻城狮们(Thread)的诉求(Message)的?

攻城狮们看似直接与CTO打交道(mCTOHandler.sendMessage(message)),但实际上,CTO日理万机,面对同时而来的一线人员的直接诉求,显然无法面面俱到,因此助理(Looper)在这里充当了很重要的角色,当Thread发送Message时,Looper中的消息队列MessageQueue会将Message对象存起来。我们从Handler的sendMessage()说起:


Message存入MessageQueue中

在这样的组织架构下,CEO老张—技术总监—攻城狮们—助理小怡—助理随身携带的那个消息盒子,几个角色之间默契而高效的配合着,真正实现了团队之间1+1>2。

(三)年终总结


一年下来,公司高速运作着,在刀光剑影的互联江湖厮杀出一片立足之地。CTO对公司现有模式非常认同,在百忙之中,做了一份年终总结,总结了主线程—子线程—Handler—Looper—MessageQueue—Message之间的关系。如下图所示:


Handler流程图

             转载至   http://www.jianshu.com/p/e04698eaba88



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 包包金属刮花了怎么办 鞋子刮了黑印子怎么办 黑色鞋跟磨白了怎么办 脚穿鞋子磨起泡怎么办 脚被鞋子磨红了怎么办 脚被鞋子磨黑了怎么办 白鞋皮鞋磨了皮怎么办 小脚趾磨肿了怎么办 穿鞋小拇指磨脚怎么办 高铁东西忘了怎么办 人故意去撞车死了怎么办? 新货车上户超重怎么办 车险出保单车号填错怎么办 货车拦板变形了怎么办 行车监控看不清楚车号怎么办? 1.5米的鱼缸要怎么办 被锤子砸到手了怎么办 家里地下污水管道堵塞怎么办 家里pvc灯罩变黄怎么办 欧普吸顶灯灯罩坏了怎么办 硬盘用久了变慢怎么办 地税申报工资人员弄错怎么办 买保险保单丢了怎么办 买保险的银行卡丢了怎么办 没学过JAVA入职怎么办 磨砂皮擦了鞋油怎么办 磨破皮伤口有沙子怎么办 工行信用卡被风险锁定了怎么办 超重被超限站查住以后怎么办 银行卡输入密码次数超限怎么办 信用卡密码错误次数超限怎么办 农行密码错误次数超限怎么办 剪力墙偏心受拉怎么办 韵达快递寄丢了怎么办 重要快递送丢了怎么办 快递员送货丢了怎么办 买的快递丢失了怎么办 申通把件弄丢了怎么办 淘宝快递送丢了怎么办 我的快递丢了怎么办 顺丰快递丢件怎么办