Android消息机制

Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃,因为在ViewRootImpl.checkThread对UI操作做了验证,导致必须在主线程中访问UI,但Android在主线程中进行耗时的操作会导致ANR,为了解决子线程无法访问UI的矛盾,提供了消息机制

 Android消息机制主要指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。MQ即消息队列,存储消息的单元,但并不能处理消息,这时需要Looper,它会无限循环查找是否有新消息,有即处理消息,没有就等待。

主线程已经默认调用Looper.prepareMainLooper()创建Looper

接下来看下整个Handler的处理流程并且会具体分析下ThreadLocal、Handler、MessageQueue和Looper,如图:

图片
ThreadLocal工作原理

ThreadLocal是一个线程内部的的数据存储类,通过它可以在指定的线程中存储数据,存储以后,也只能在指定的线程中获取存储数据,对于其他线程来说则无法获取到数据。在Handler中,需要获取当前的线程的Looper,而Looper作用域就是线程并且不同线程具有不同的Looper,使用ThreadLocal可以轻松实现Looper在线程中的存取。

ThreadLocal的get和set方法操作的对象都是当前线程ThreadLocalMap,读写操作仅限于各自线程的内部。这也是为什么ThreadLocal在多个线程中互不干扰的操作。

MessageQuequ工作原理

 MessageQueue只有两个操作:插入和读取。其内部是一个单链表的数据结构来维护消息列表,链表的节点就是 Message。它提供了 enqueueMessage() 来进行插入新的消息,提供next() 从链表中取出消息,值得注意的是next()会循环地从链表中取出 Message 交给 Handler,但如果链表为空的话会阻塞这个方法,直到有新消息到来

Looper工作原理

Looper在Android的消息机制中扮演着消息循环的角色,它不停从MessageQueue查看是否有新消息,有会立即处理,否则会一直阻塞在那里。
Looper会在构造方法中构建一个MessageQueue和当前线程对象。

Looper提供了两个退出方法quit和quitSafely,区别是前个是直接退出,后一个把消息队列中已有的消息处理完毕后安全退出,均是调用MessageQueue中退出quit方法。

Looper最重要的方法是loop方法,只有调用了loop后,消息系统才会真正的起作用。

loop方法是一个死循环,唯一跳出就是next返回null。如果next返回了新消息,会调用msg.target.dispatchMessage(msg)处理消息(即Handler处理)。

Handler工作原理

Handler的工作主要包含消息的发送和接收过程。消息发送通过post系列方法和send系列方法来实现,而post最终还是调用sendMessageAtTime方法来实现发送消息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值