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的识别的
本文地址:https://blog.csdn.net/qq_30578803/article/details/110633521