Handler消息机制

ThreadLocal中存放的是ThreadLocalMap

1.为什么要使用handler?

主线程不能执行耗时操作,否则会anr,所以需要用到多线程,如何让知道子线程中的任务何时完成,

如何在子线程之间传递数据?所以使用handler实现线程间通信。

线程安全主要是通过ThreadLocal实现的

1.Handler 的基本原理?

handler在子线程中通过sendmessage或者post发送消息到消息队列,然后looper通过looper.loop循环不停的从消息队列出取出消息,然后通过消息的handler的

dispatchMessage去处理这个消息,通过分发消息里面的实现callback或者handleMessage实现在主线程里面更新ui

2.添加消息队列的时候,延时操作是通过设置消息的when为当前时间加上延时时间,然后再添加的时候,按照时间顺序添加。

3.子线程中使用handler,需要创建Looper.prepare并且Looper.loop()循环

4.messagequeue没有消息时,loop是被阻塞住的,通过message.next方法里的nativepollOnce,

通过调用linux系统的epoll.wait执行等待,之前也是使用java的wait和notify实现的,但是因为需要处理底层的东西,所以只能用底层的阻塞。

5.多线程给messageQueue发送消息时,是怎么保证线程安全的,是通过synchornized锁

6.view.post实际上也是handler.post方法调用的,但是是在viewRootImpl生成之后,所以他能准确的获取宽高

7.handler通常会写成静态内部类,获取外部类使用软引用,并且结束的时候移除掉所有回调。

8.子线程是可以操作ui的,因为当viewRootImpl还未生成时,无法通过checkThread检测当前线程是否是主线程。

多个handler是通过msg.target实现当前handler的识别的

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值