Android_消息机制
Android通过Looper、Handler来实现消息循环机制。
Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环。
Android系统中的Looper负责管理线程的消息队列和消息循环。通过Looper.myLooper()得到当前线程的Looper对象,
通过Looper.getMainLooper()得到当前进程的主线程的Looper对象。
主线程有默认的消息队列和消息循环
工作线程是没有的,所以需要自己创建
创建步骤为:
class WorkThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// 处理收到的消息
}
};
Looper.loop();
}
}
Handler 的用处
Handler的作用是把消息加入特定的Looper所管理的消息队列中,并分发和处理该消息队列中的消息
构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper对象创建
eg.
thread->Handler->message->Message queue->looper->UI Manin (Thread)
一个Activity中可以创建出多个工作线程,如果这些线程把他们消息放入Activity主线程的消息队列中,
那么消息就会在主线程中处理了。因为主线程一般负责视图组件的更新操作,对于不是线程安全的视图组件来说,
这种方式能够很好的实现视图的更新。
那么,子线程如何把消息放入主线程的消息队列中呢?只要Handler对象以主线程的Looper创建,
那么当调用Handler的sendMessage方法,系统就会把消息主线程的消息队列,
并且将会在调用handleMessage方法时处理主线程消息队列中的消息。
对于子线程访问主线程的Handler对象,你可能会问,多个子线程都访问主线程的Handler对象,
发送消息和处理消息的过程中会不会出现数据的不一致呢?答案是Handler对象不会出现问题,
因为Handler对象管理的Looper对象是线程安全的,不管是添加消息到消息队列还是从消息队列中读取消息都是同步保护的,
所以不会出现数据不一致现象。
最新文章
- sift特征
- centos6.5 mysql-server 5.1.73启动失败
- 重新想象 Windows 8.1 Store Apps (87) - TTS: Speak Text, Speak SSML
- Install gocode
- Android屏蔽HOME键
- zabbix监控phpfpm
- C# 枚举 字符串 转换
- 让PHP程序永远在后台运行
- js基础——属性操作
- 计算机网络分层(OSI七层、 TCP/IP四层)
- 每天一个Linux命令(05)--rm命令
- 在配置wem.xml后,Tomcat遇到问题,启动失败的解决方法
- ElasticSearch入门(2) —— 基础概念
- css布局中的百分比布局
- spring资源加载结构解析
- LAB6 SOAP
- Linux 网卡聚合
- 13.模板方法(Template Method)
- 从零开始学 Web 之 BOM(四)client系列
- Java动态代理、XML、正则
热门文章
- Linux查看用户和组命令
- Ubuntu添加PPA源
- PHP basename() 函数
- UVALive - 3401 Colored Cubes
- 气死人不偿命,Q_OBJECT导致的C++报错,而且还看不明白(#ifdef没控制好,导致什么都不认识了)
- Android Integer.decode()和Intger.valueof()
- app与server联系
- Android 常用UI控件之TabHost(2)简单示例
- MyBatis学习总结1
- sql 不同server間寫入數據