`
ylzyd12345
  • 浏览: 118412 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
博客专栏
713488f4-d0a9-3f35-997f-199fb0cb3563
玩懂Log,打开Andro...
浏览量:10141
社区版块
存档分类
最新评论

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

 
阅读更多

 

 

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

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics