大话Handler机制

版权声明:如需转载请注明出处 https://blog.csdn.net/zhonglunshun/article/details/80285339

大话Handler机制

handler机制是安卓开发人员必须掌握的一个重点,也是面试官最容易问到的问题,本文以一种非常通俗易懂的方式和大家聊聊handler机制,不了解handler和对handler一知半解的同学欢迎往下阅读,为了方便大家阅读,先列出本文的大纲:

  • 什么是Handler
  • 为什么要引用Handler
  • Handler的工作原理
  • 总结

什么是Handler

handler是Android给我们提供用来更新UI的一套机制,UI线程负责UI绘制更新,也就是我们说的主线程,UI线程也是线程,只是这个线程专门用来更新UI界面。

为什么引入Handler

Handler的引入是为了解决多线程并发的问题,怎么理解呢?
打个比方,我们有一个Activity页面,这个Activity中有多个线程,这些线程也没有加锁,大学时候我们学过数据库,当多个线程操作同一个变量的时候就没办法保证这个变量是我们想要的结果,同样的,如果有多个线程操作Activity界面,那么界面就可能显示混乱;
加锁可不可以解决显示混乱的问题?当然可以,但会使得UI访问逻辑变的复杂,其次降低 UI 访问的效率;
出于对性能的考虑,Android引入了handler机制,这样使得开发者不需要关心多线程的问题,所有的UI更新的操作都是在主线程中完成,想在子线程中操作UI,使用handler即可;

Handler机制工作原理

怎么理解handler的运行原理呢?这里我打一个比较通俗的比方:
一个公司要正常运转至少需要一个CEO,但是只需要一个CEO是不够的,因为业务的扩大,CEO会越来越忙,那么就需要招聘下属,于是,CEO招聘了一个部门主管,然后主管招聘了一堆基层工作人员,于是一个初具规模的公司就成立了,那么这些人在干什么呢?

CEO:作为公司的大boss,为了把公司越办越好,7天24小时无休,有事情就会立马处理;
主管:连接基层人员和CEO,处理CEO的指令,同时传达基层人员的需求和反馈;
基层人员:他们受命于主管,并对主管汇报,这些工作人员是干实事的,执行具体耗时的任务;

CEO因为肩负整个公司的兴衰,为了把公司办好,CEO是24小时无休息(自己的公司,没办法),因为CEO要处理很多事务,有时候不能及时处理主管汇报的一些事情,为了解决这个问题,CEO搞了一个备忘录,CEO 无限循环的工作就是不断查看备忘录,如果有任务,CEO一条一条把任务取出来,让主管去处理,如果备忘录的任务都做完了,CEO就去休息,这个备忘录有一个特别的功能,当有新的工作被记录到备忘录,就会有一个闹钟叫醒CEO让他继续处理备忘录,如此循环往复;

在上边我们引入了Looper、Handler、MessageQueue,Message,那么这些东西具体的作用和存在的意义是什么呢?

Looper

为什么引入:我们知道线程其实就是一段程序代码,当这段代码执行完了,那么这个线程的生命周期就走完了,我们的UI线程是需要不断的更新界面的,自然不能执行以下就完了,需要在主线程中创建一个循环;
怎么工作:Looper在调用:Looper.prepare()和Looper.loop()方法之后就会在主线程中创建一个while死循环,主线程会在死循环中等待其他线程给它发送消息,这些消息包括activity启动,UI更新,控件以及处理生命周期,一有消息就做相应的处理;

MessageQueue

为什么引入:MessageQueue的存在很简单,因为一个线程在同一时间只能处理一件事情,不存在并发性,要保证有序的处理完成消息就需要一个消息队列来记录消息和消息对应的顺序,然后把消息挨个拿出来处理;
应用扩展:我们在写一些及时通讯软件的时候也会用一个队列保存要发送的消息,以保证消息的有序送达;

Handler

为什么引入:简单来说,Handler是用于同一个进程之间的线程间通讯,Looper让主线程不断地从MessageQueue取消息,那么处理处理是在主线程中进行的,那么怎么在其他线程发消息到MessageQueue里面呢?
其实很简单,我们知道同一个进程中间,线程于线程之间的资源是共享的;也就是任何变量在不同线程之间都是可以互相访问的;既然是这样,那我们就只需要做好并发和同步就可以了,这里用的是MessageQueue,也就是说只要拿到了MessageQueue就能够往里面放消息;
怎么工作:我们通过主线程的Looper.myLooper().mQueue就能拿到这个消息队列,Google为了统一开发,把这段代码封装成一个类,我们只需要在主线程中构建Handler的实例对象,就能拿到MessageQueue,更人性化的是,Handler只需要调用sendMessage方法,就能把消息加入到MessageQueue;
Handler的另一个作用就是能够统一处理消息回调,这个设计非常棒,具体的做法是让Message持有Handler的引用,也就是哪个Handler把它放到队列里,这个message就持有Handler的引用,等到主线程轮训到这个message的时候,就调用这个message对应handler的handleMessage(Message msg)方法;

Message

想要主线程做点事情,总得告诉主线程要做什么吧?这个Message里面有两个变量,一个是what,一个是obj,what用来区分要干啥,obj用来携带数据(假如有额外数据的话),值得注意的是,像LAUNCH_ACTIVITY,PAUSE_ACTIVITY这些生命周期的处理也是通过Handler机制传递的,主线程拿到这些消息后进行相应的处理;

总结

到这里我们队Handler机制有了一个比较系统的了解了,为了让大家印象更加深刻一点,我通过一组图给大家展示一下Handler的工作原理:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhonglunshun/article/details/80285339
今日推荐