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

Handler-不可缺少的异步(sundy深入浅出)之进程和线程

程序员文章站 2022-06-30 18:22:04
...

 

 

写在前面的话:本系列主要是学习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,那么子线程就会有自己的消息队列