Handler-不可缺少的异步(sundy深入浅出)之进程和线程
程序员文章站
2022-06-30 17:50:51
...
写在前面的话:本系列主要是学习sundy的Android深入浅出视频中的一些记录,心得。方便自己以后查阅。也供大家查看。欢迎交流,补充。
一般作为面试题(有些有答案,有些没有。问题一般从sundy老师思维导图中摘录,答案并非唯一标准,仅供参考):
1、使用Handler是异步的,它会建立新线程么?
不会
2、Handler是在主线程内么?
一般情况下,handler是在主线程内,不过我们也可以控制在当前线程内,比如传入的loop是当前线程的。
3、Handler的post 和 sentMessage方法,使用的是一个队列还是两个?
使用的是一个队列,查看Handler的实现源代码,就会发现post和sentMessage调用的是同一个方法。
4、子线程中建立一个handler,然后sendMessage会怎样?
会抛异常,但是如果在子线程中实例化loop,则正常
5、子线程建立handler , 构造的时候可以传入主线程的Looper 吗?
可以
6、当前线程中有一个Looper这样的循环在监听消息队列,但又不是额外的线程,这不是和我们学习的常理相悖么?
不相悖,Looper是由系统来控制的
7、Handler是什么,作用以及为什么要引入Handler的概念?
Hanlder作用:
1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器
2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。
角色描述:
1)Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道) 。
2)Handler: 你可以构造Handler 对象来与Looper 沟通,以便push 新消息到Message Queue 里;或者接收Looper( 从Message Queue 取出) 所送来的消息。
3) Message Queue( 消息队列): 用来存放线程放入的消息。
4 )线程:UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个Message Queue 。
每一个线程里可含有一个Looper 对象以及一个MessageQueue 数据结构。在你的应用程序里,可以定义Handler 的子类别来接收Looper 所送出的消息。
8、主线程就一个消息队列,为什么不同Handler实例之间不能共享消息?
以内message有一个属性what target是一个标志(这里sundy已经说明这里课程里讲错了,应该是 target 属性)
9、Handler1.sendMessage, Handler2能接收么?
不可以,答案同8
------下面是一些总结------
1、Handler实例与消息处理是关联的,发送和接收要匹配---handle1发送的数据,要由handle1来接收
2、Handler操作队列,主要是在子线程操作主线程消息队列---最常见的就是在子线程中更新UI界面
3、子线程默认是没有消息队列的---但是我们可以使用HandleThread,那么子线程就会有自己的消息队列