Android的消息机制


一、概述


Android中线程操作主要有两个规则:
  • 1、只能在主线程中更新UI,否则抛出异常
  • 2、耗时操作必须在子线程进行,在主线程进行会引起ANR错误

针对上面两种情况,Android引入了消息机制:
Android的消息机制主要指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支持。
MessageQueue是消息队列,采用单链表的数据结构来存储消息。
Looper是一个轮询器,以无限循环的方式去查找是否有新消息,如果有就处理,否则一直等待。
Looper中还有一个概念 ThreadLocal,它可以在每个线程中存储数据,保证线程之间的数据互不干扰。

二、Android的消息机制分析


1、ThreadLocal的工作原理

一般来说,当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑在每个线程中使用ThreadLocal。

1)ThreadLocal的set方法
取出当前线程的localValues对象,如果这个对象为null就先进行初始化,然后调用这个对象的put方法来存储ThreadLocal的值,put方法中,ThreadLocal的值在table数组中的存储位置总是在ThreadLocal的reference字段所标识的对象的下一个位置。

2)ThreadLocal的get方法
取出当前线程的localValues对象,如果这个对象为null就返回初始值null,如果不为null,就取出它的table数组并找出ThreadLocal的reference对象在table数组中的位置,然后table数组中的下一个位置所存储的数据就是ThreadLocal的值。

2、MessageQueue的工作原理

其中包括两个操作:
1) enqueueMessage:往队列中插入一条消息,也就是单链表的插入操作。
2 )next:是一个无限循环的方法,如果消息队列没有消息,next方法处于阻塞状态,如果有消息,就从队列中取出一条消息并将其从消息队列删除。

3、Looper的工作原理


1)在构造方法中,它会创建一个MessageQueue,然后将当前对象保存起来。
2)通过Looper.prepare()为当前线程创建一个Looper。
3)再使用Looper.loop()来开启消息循环。
  •    -loop方法是一个死循环,当Looper的quit方法被调用时,Looper就会调用MessageQueue的quit和quitSafely方法来通知消息队列退出,此时消息队列的next方法就会返回null,Looper结束循环。
  •    -msg.target.dispatchMessage(msg):切换到指定线程中去处理消息。
 

4)在合适的时候退出Looper

  •  -quit:直接退出Looper
  •  -quitSafely:设定一个退出标记,然后把消息队列中的以有消息处理完毕后才安全退出。

4、Handler的工作原理

Handler主要完成消息的发送和接收工作,主要通过post或者send的一系列方法来实现。

  • 1)发送消息:仅仅向消息队列中插入一条消息,然后MessageQueue的next方法把这条消息返回给Looper,Looper再把这条消息交给Handler处理。
  • 2)接收、处理消息:调用Handler的dispatchMessage方法
首先,检查Message的callback是否为null,不为null就通过handleCallback来处理消息,否则,检查mCallback是否为null,不为null就调用mCallback的handleMessage方法来处理消息。

5、主线程的消息循环

在main方法中系统会通过Looper.prepareMainLooper来创建主线程的Looper和MessageQueue,并通过Looper.loop()来开启主线程的消息循环。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值