Handler源码阅读随笔

Handler源码阅读随笔

1.Handler的创建

在App启动的时候,在ActivityThread的main方法里,会为主线程会调用Loop.paper方法,该方法会在TLS里创建并保存一个Loop对象,而在创建Loop对象时,会在Loop的构造方法里创建一个MessageQueue,最后会调用Loop.loop方法来开启循环。

2.Loop是如何保证线程唯一的

在Loop的paper方法中创建Loop对象时,会将创建的对象保存在ThreadLocal中,ThreadLocal内部是一个HashMap的结构,Loop在每次创建的时候都会去TLS里获取是否已经创建。

3.Handler的唤醒机制

Handler的底层实现是管道的方式,利用IO的多路复用机制,如epoll等,当MessageQueue里没有要处理的消息,且也没有空闲消息处理,此时的Loop会进入阻塞状态。当在Java层创建一个MessageQueue时,在Native层也会创建一个NativeMessageQueue,同时NativeMessageQueue会创建一个NativeLoop。并创建一个管道,同时将管道的读端文件描述符和写端文件描述符保证在Loop的成员变量中,当执行Java层的enqueueMessage方法后需要唤醒Loop循环时,会直接在管道中的写端文件描述符中写入一个字符“W”,当读端文件描述符监听到时就会唤醒Loop循环。

4.Handler的同步屏障机制

当target为null时,此Message不会被处理,但是loop循环会忽略接下来的所有同步Message,直到遇到一个异步Message。多用于View的视图刷新,以此来保证过多的Message不会影响到View的刷新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值