浅谈对handle的理解

handler是Android中重要的消息机制,我们在平常的开发中也是经常接触到的,下面是我个人总结的一些观点和理解,希望和大家分享一起讨论。

首先呢,Handler的主要工作是采用当前线程的Loop来构建内部的消息循环系统。讲到handle就不得不提起MessageQuequeloop了,毕竟这哥三可是好基友啊!其中,MessageQueque顾名思义,就是消息队列的意思,它里面主要有这两种方法,一个是send(),一个是enQueueMessage(),以队列的形式的发送和插入消息。虽然它叫做消息队列,但是其内部结构却是单向的链表,就像我们平时看到一些人看着很壮实,实际上是个娘炮。哈哈哈,不知道这个比喻是不是能更容易接受。而Looper呢,翻译过来就是循环了,你想想啊,MessageQueque是个只能存储消息,但是它处理不了消息,这时候它的二哥looper就上场了,它可是个出了名的勤劳,一上来就给自己套了一个死循环,一直去寻找消息,如果没找到,就在那边等待,没错,就是应用了很像线程池的原理。啥?你说looper使用了死循环没有发生ANR?只能说小伙子你还年轻,如果你仔细的去看源码就会发现其实很多都是有由linux和c++编程的,并不是仅仅只用了java ,这边的

  for  (;;) {
             Message msg = queue.next();  // might block
             if  (msg ==  null ) {
                 // No message indicates that the message queue is quitting.
                 return ;
             }
循环在我这边看来更像是车产车价提供动力的而已。


既然说到了looper,就要提提其中的一个特殊存在Threadlocal,别看人家前面是thread就以为它是线程,它的作用是在每个线程中存储数据,当Handler创建之后,就是通过Threadlocal来获取当前线程的looper才能工作的。Threadlocal的工作场景比较特殊,1,需要在线程作为作用域,2,不同的线程之间具有不用的数据副本的时候。比如还有采用事件监听的时候,在一些函数调用栈深的情况下,使用起来还是杠杠滴好。记住一句话,一个线程内对应的只有一个loop,这个是唯一的!Threadlocal内部的数据遵循着相互隔离,互不干扰的原则,也就是线程隔离,里面存储的形式就是用key,vaues的哈希i形式。

然后呢,





这个图呢是在动脑直播的时候截图下来的,贼清晰,里面的工作原理就一目了然了,Handler先进行消息的发送,发到了MessageQueque那边,looper就是个传送带,loop.prepare()就是个动力开关,然后通过Looper.loop()来开启消息循环,直到消息执行了next(),返回null为止,这期间handle有一个handerCallBack()把消息回传给了handler,这就是Handler的通讯机制啦。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值