android之handler切换线程终极篇

前言:最近部门招人的时候,对于我的一个问题(在handler的机制流程里,哪部分原理是真正的起到了切换线程的作用?)很多候选人都是说不出来,或者表达不清楚(虽然他们对handler的整体机制原理说的头头是道)。所以,才有了我今天这篇老生常谈的文章,但是我今天主要不是给大家介绍handler机制原理或者怎么去使用它,而是想帮大家弄明白咱们的handler究竟是怎么实现了线程的切换

作为文章的开始,我想先来纠正一个很多人习以为常的说法:handler是用来实现子线程到主线程的切换去更新ui的。

这个说法是没问题的,但是我想强调的是这不是handler的唯一作用,Handler的主要作用就是将一个任务切换到指定的线程中去执行,这个切换线程指的是任何线程,不单是切换到主线程!!!

好了,啰嗦的话说完了,下面开始今天的正文了。。。

我先带着大家回顾一下handler的机制吧(以下内容都是个人想法和认知,如有问题请指出)

先说一下Handler机制的主要作用(可不是全部作用呦):

我们知道android设备作为一台移动设备,不管是内存或者还是它的性能都会受到一定的限制:大量的使用CPU的资 源(一般是指CPU做了大量耗时的操作)会导致手机变得很卡甚至会出现程序无法响应的情况,即出现ANR异常(Application Not Responding)。比如:在UI线程中如果5秒之内没有相应的输入事件或者是BroadcastReceiver中超过10秒没有完成返回的话就会触发ANR异常。这样就要求我们必须要在写代码的时候格外注意不能将大量耗时的操作放在UI线程中去执行,例如网络访问、数据库操作、读取大容量的文件资源、分析位图资源等…

正式由于Android系统的这些特性导致开发者在进行开发的时候必须要将比较耗时的操作远离UI线程(ActivityThread),单独的将这些操作放入到子线程中进行执行,在子线程完成代码执行之后将等到的结果数据返回到UI线程(android系统规定在子线程中不允许访问UI),同时UI线程根据这些返回的数据更新界面UI,从而实现了人机之间友好的交互。

对于咱们的Handler来说主要作用就是将一个任务切换到指定的线程中去执行。而这样的特性正好可以用来解决在子线程中无法访问UI的矛盾。 

一,Handler机制之MessageQueue介绍:

MessageQueue通常翻译为“消息队列”,它内部存储了一组数据,以队列的形式对外提供插入和删除操作。虽然被称之为消息队列,但是实际上它的数据结构却是采用的单链表的结构来存储消息列表(单链表在插入和删除操作上效率比较高)。 
MessageQueue主要包含两个操作:插入(enqueueMessage)和读取(next)。

  • 插入:enqueueMessage()方法是往消息队列中插入一条数据
  • 读取:next()方法用于消息的读取,读取操作本身也会伴随着消息的删除操作,即从消息队列中取出一条数据并将该数据从消息队列中删除。

这里需要指出的是,next方法是一个无限循环的方法,如果消息队列中没有消息,那么next方法会一直堵塞,有新消息的事后,next方法会返回这条消息并从链表中删除该消息。

  • 15
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值