浅谈对handle的理解

来源:互联网 发布:极客学院java百度网盘 编辑:程序博客网 时间:2024/06/05 23:43

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的通讯机制啦。



原创粉丝点击