Android的消息机制
来源:互联网 发布:king新域名 编辑:程序博客网 时间:2024/06/05 11:12
一、概述
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
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android 的消息机制
- Android的消息机制
- Android 的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android 的消息机制
- Android的消息机制
- Android的消息机制
- android的消息机制
- Android的消息机制
- javascript+css实现进度条效果
- hive函数大全
- 数据降维方法
- AtomicInteger的并发处理
- 关于nginx的几个核心配置说明
- Android的消息机制
- [拓扑图] [模拟] 电子表格计算器 (excel)
- Python中scikit-learn数据转换
- 素数打表的快速方法
- android基础--tools:context=".MainActivity"作用
- HDU 2669:Romantic(扩展欧几里得)
- 重置表单
- Scala???????
- 机器测试