Android的消息机制——概述

1.Android消息机制主要指Handler的运行机制,Handler底层需要MessageQueue和Looper的支撑,MessageQueue在内部存储结构是采用单链表的数据结构来存储消息列表。

系统之所以要提供Handler,最主要的原因就是为了解决在子线程中无法访问UI的矛盾。

2.Looper以无限循环的形式去查找MessageQueue是否有新消息,如果有消息就处理,否则一直等待。

3.Handler创建的时候会采用当前线程的Looper来构造消息循环系统,那么Handler内部如何获取当前线程的Looper,答案就是ThreadLocal

4.ThreadLocal可以在不同线程中互不干扰的存储并提供数据,通过它可以轻松的获取每个线程的Looper.

注意:

  a.线程默认没有Looper,所以使用Handler就必须为线程创建Looper.

  b.a点所说的并不包括主线程--UI线程,也就是ActivityThread,ActivityThread被创建时会初始化Looper,这也就是为什么默认使用Handler的原因。


5.Android规定了访问UI只能在主线程中,如果子线程访问UI,就会程序抛出异常。源码如下:

void checkThread(){
if(mThread != Thread.getCurrentThread(){
throw new CalledFromWrongThreadException(“ only the orginal thread that created a view hierarchy can touch its view.”);
}}

6.系统为什么不允许在子线程中访问UI?

  a.试想一下,在多线程中并发访问可能会怎么样?UI控件处于不可预期的状态,我们不知道UI会变成什么样子。所以说Android的控件不是线程安全的。

  b.为什么系统不对UI控件的访问加上锁机制?加上UI锁一是变的逻辑复杂,二是降低UI的访问,锁机制会堵塞某些线程执行。

  c. 所以 虽简单高效的就是单线程模式来处理UI操作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值