欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Handler消息机制

程序员文章站 2022-06-23 09:09:09
ThreadLocal中存放的是ThreadLocalMap1.为什么要使用handler?主线程不能执行耗时操作,否则会anr,所以需要用到多线程,如何让知道子线程中的任务何时完成,如何在子线程之间传递数据?所以使用handler实现线程间通信。线程安全主要是通过ThreadLocal实现的1.Handler 的基本原理?handler在子线程中通过sendmessage或者post发送消息到消息队列,然后looper通过looper.loop循环不停的从消息队列出取出消息,然后通...

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