handler机制--handler概览

本节主要是对handler机制有一个大概的了解,后面的章节还会详细的分析handler机制。

handler产生背景

在介绍handler之前先来介绍下它产生的背景,只有了解了背景才能加深对它的了解。

子线程与主线程通信

子线程与主线程通信,那肯定是一些操作是不能在子线程中进行的,只能在主线程进行。那就从哪些操作需要在主线程中执行说起吧。

ui的绘制/更新只能在主线程
android中ui的绘制/更新只能在主线程中,为啥会有这样的一个规定呢?主要的原因是为了ui绘制/更新的”安全性,一致性“。

假如在子线程中也可以进行ui的绘制/更新,那会有什么问题呢?比如当前有2个子线程:线程A,线程B,同时分别把TextView的内容设置为”hello A“,”hello B“。那这时候界面上显示的TextView的内容就不确定了,有可能显示”hello A“,也有可能显示”hello B“。造成这个的主要原因是:两线程同时设置,并且这俩线程先后执行的顺序是不确定的。

那应该有人就会说,在为TextView设置text的时候,增加同步锁(synchronized)不就可以解决问题了吗?是的这样确实可以解决问题,但又引入了别的问题:绘制效率问题,复杂度问题,容易出现死锁问题等。
绘制效率问题:因为有了锁,那等待,释放锁,线程之间的切换都是开销,这会严重的影响绘制效率。
复杂度问题:整个View体系相应的改变View属性的地方都需要加synchronized,有漏掉的地方就会出现绘制出错的问题。
容易出现死锁问题:因为有了同步机制,那死锁的概率就会大大增加啊,死锁的问题有多严重大家都清楚,界面上会出现卡顿,甚至没办法执行绘制的情况。

所以基于以上的这些问题,ui的绘制/更新在主线程中执行这是最简单有效的方法。

主线程不能有耗时任务
像上面提到的ui的绘制/更新需要在主线程中执行,还有点击事件的分发,四大组件的生命周期方法执行等都是需要在主线程里面执行的。如果主线程里面存在耗时的操作,那产生的问题就大了,比如在Activity的onCreate方法中有耗时操作,那就会影响后面的生命周期的执行,站在用户角度来看的话,整个界面显示很慢,长时间处于白屏状态,这肯定不是一个好的用户体验。

因此耗时的任务就需要放在子线程里面执行(比如网络请求,读取本地文件等等),当子线程执行完毕后,就需要把需要更新view的数据发送给主线程,让主线程帮忙绘制view。

binder线程与主线程通信

在启动Activity时候,AMS(ActivityManagerService简称)会通过binder调用把消息发送给app端,这个时刻是运行在binder线程中的,那后续Activity的初始化,启动等流程肯定是不能继续在binder线程中的,为啥不能继续在binder线程中?主要原因是binder线程的作用是处理binder相关的操作,既然binder操作已经完成了那肯定就需要赶紧把binder线程“解放”出来,让它继续处理其他的binder操作;如若不把binder线程”解放“出来,会影响app端binder的服务,同时Activity启动及四大组件相关的启动操作都会变的复杂,因为需要涉及到”安全性,一致性“相关的问题。

上面提到的子线程与主线程通信binder线程与主线程通信,这只是线程之间通信的其中两个场景,还有很多其他的场景(比如业务内也会有线程之间通信),android设计者,为了开发者更加便利,不用重复的造轮子。因此在这样的背景下设计了handler,handler目的是解决线程之间通信问题

handler原理

生产者消费者模式

先来介绍下生产者消费者模式,为啥要介绍这个模式呢,因为handler的核心原理就是生产者消费者模式。

shengchan-xiaofei.png

上图展示的是生产者消费者模式,生产者把数据放入数据缓存区中,消费者从数据缓存区中取数据,生产者可以有多个,消费者也可以有多个,生产者与消费者一般都位于不同的线程。
生产者消费者模式可以衍生出多种结构:多个生产者和多个消费者(消费者处于不同的线程,多个生产者和一个消费者,一个生产者和一个消费者等。

生产者消费者模式实现线程之间通信
最主要是基于共享内存这个机制,一个进程内的内存在线程之间是共享的。

shengchan-xiaofei-threads.png

上图的结构是多个生产者和一个消费者的结构,展示了是如何实现线程之间通信的,下面对上图进行介绍:
数据队列:它是线程之间共享的,它主要的目的是存放数据,数据读取器从中拿数据。因为数据队列是多线程之间共享的,因此需要使用同步机制来保证它的安全。
数据读取器:这是我自己取的一个名字,它的主要作用是不断的循环从数据队列中拿数据,拿到数据后交给处理者处理数据。
处理者:这也是我自己去的一个名字,它的主要作用就是处理数据,是生产者消费者模式中的消费者角色。
消费者线程:数据队列,处理者,数据读取器都在这个线程内执行。

当数据队列中没有数据的时候,消费者线程进入wait状态并且释放掉cpu等资源。

当线程1的生产者把数据放入数据队列后,会把处于wait状态的消费者线程唤醒,这时它的数据读取器从数据队列中取到刚刚的数据,再把数据交给处理者处理。这个过程就实现了线程1与消费者线程之间的通信。

handler的核心原理就是生产者消费者模式,基于此基础上进行封装,封装出了Looper,Handler,Message,MessageQueue这些类,那就来介绍下这几个类。

handler核心类

Looper:与上面的数据读取器的功能类似,它的作用就是从MessageQueue中取出Message交给Handler处理,Hanlder处理完毕后,再不断的接着这样的循环此过程。
MessageQueue:它就是上面的数据队列,它的作用就是用来存放Message,以链表结构存放Message的,并且为Looper提供Message,当队列中没有Message的时候线程进入wait状态;当往队列中存放Message后,MessageQueue所在的线程被唤醒,获取到Message交给Looper处理。
Message:与上面的数据相对应,线程之间通过handler通信,传递的数据就是Message
Handler:它就是消费者,与上面的处理者相对应,它的作用是在它对应的线程内处理Message。

总结

本节主要介绍了handler的产生背景和handler的原理,这节只是一个概览,handler的知识是很多的,在后面的章节中会一一介绍,下面用一张图来做一个总结


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

推荐阅读更多精彩内容