掌握关于Handler的这些基本问题,让你的面试事半功倍!

前言

Handler是个老生常谈的问题,我相信几乎所有的Android开发者都会使用Handler,那关于Handler还有什么好讲的吗?Handler如果仅仅是使用的话,确实没什么好讲的,但是Handler却是一个几乎所有面试官都会问的问题,不同的要求问的深度也不一样,今天我就带大家学习一下关于Handler你所必须要掌握的知识。

Handler消息机制

首先有四个对象我们必须要了解一下HandlerLooperThreadLocal还有MessageQueue

Handler

首先我们要明白Handler消息机制是用来干嘛的?Handler是把其他线程切换到Handler所在的线程,注意,这里不是UI线程。虽然我们的大多数使用Handler的场景,都是我们在子线程做了一下耗时的操作(IO或者数据库),当子线程执行完以后我们可能需要更新UI,这个时候我们用Handler来处理(sendMessage()或者post())就把子线程切换到了UI线程了。假如说,我们现在有这么一个需求,线程A发个信息给线程B(线程A、线程B都不是主线程),这个时候我们用Handler依然可以做,只需要在线程B中创建好Handler就可以了(关于如何在子线程创建Handler我会在下面详细说明)。所以,Handler并不是把其他线程切换到主线程(UI线程),而是切换到它所在的线程,这一点一定要弄清楚。

Looper

Handler消息机制里面最核心的类,消息轮询。Handler要想切换线程(或者说发送消息),必须要先获得当前线程的Looper,然后调用Looper.loop()方法把MessageQueue里面的message轮询出来"交"给Handler来处理,至于如何“交”给Handler的,下面我会通过源码带大家分析。

ThreadLocal

ThreadLocal是Looper内部的一个,它虽然前面有个“Thread”,但其实它并不是线程,它相当于一个线程内部的存储类。刚才在讲Looper的时候我们说到,“Handler要想切换线程(或者说发送消息),必须要先获得当前线程的Looper”,那如何获得当前线程的Looper呢?正是通过ThreadLocal,它可以在不同线程之间互不干扰地存储数据。ThreadLocal里面有一个内部静态类对象ThreadLocalMap,通过其set()和get()方法对数据对象进行保存和读取。

MessageQueue

MessageQueue——消息队列,虽然它叫消息队列,但实际上的结构并不是一个队列,而是一种单链表的数据结构,只是使用列队的形式对数据进场做添加或者移除。MessageQueue是在Looper被创建的时候由Looper生成的。同一线程下,Handler发送的所有message都会被加入到MessageQueue里面,当Message被loop()以后,就会从消息队列中移除。Message我没有单独拿出来,因为确实比较简单,就是消息本身,它可以携带两个int型参数,如果要传比较复杂的参数就用obj属性,what属性用来区分是哪个Handler发送的信息。

小结一下

Handler是把其他线程切换到它所在的线程,使用Handler发消息之前要先创建Looper对象,创建和读取Looper都需要使用ThreadLocal,它可以在不同线程之间互不干扰地保存数据。在创建Looper对象的同时也把MessageQueue创建好了,Handler所发的message会被添加到MessageQueue对象里面,Looper.loop()方法以后会把MessageQueue上的Message轮询出来。连接这几个对象的还有一条很重要的线,那就是线程,记住,以上的过程都要保证Handler、Looper、MessageQueue在同一线程,这样,才能保证Handler的消息机制被正确使用。

子线程创建Handler

注意:我们这里是为了让大家更好地学习Handler,所以要在子线程创建Handler,现实使用场景,很少会在子线程创建Handler

在主线程(UI线程)创建Handler,我相信所有人都会

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值