Android之Handler消息机制
来源:互联网 发布:html5解析json 编辑:程序博客网 时间:2024/05/16 09:38
Android中handler类的主要作用
1、与其他线程协同作用
2、接收其他线程的消息并通过接收到的消息更新主UI线程的内容
解决的问题:
负责主线程与子线程之间进行通讯,从而让子线程与主线程之间建立起协作的桥梁,使Android的UI更新的问题得到完美解决
Handler与子线程协作实例
1、创建Handler实现类,在主UI所在类中的内部类
class MyHandler extends Handler {
public MyHandler() { }
public MyHandler(Looper L) {
super(L);
}
// 重写handleMessage方法,接受数据并更新UI
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//此处根据msg内容进行UI操作
}
}
2、子线程的实现
class MyThread implements Runnable {
public void run() {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("cmd", "update");
msg.setData(b);
MainActivity.this.myHandler.sendMessage(msg);
//通知Handler更新UI
}
}
通过以上的两个实现,我们只需要在MainActivity中声明MyHandler实例对象就可以完成线程之间的通讯和界面的更新操作。
MyHandler myHandler = newMyHandler();
Android提供了Handler和Looper来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换。
1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)
1、Handler创建消息
每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制引入了消息池机制。Handler创建消息时首先看一下消息池是否有消息,如果有,就直接从消息池拿出消息,如果没有,就重新初始化一个消息实例。使用消息池的好处就是:消息不被使用的时候,并不作为垃圾回收,而是放入消息池,可供下次handler创建消息时使用,消息池提高了消息对象的复用,减少系统垃圾回收的次数。
2.handler发送消息
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。
3、Handler处理消息
UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。
子线程通过Handler、Looper与UI主线程通信的流程如图所示。
- android消息机制 之Handler
- Android之Handler消息机制
- Android之Handler消息机制
- Android之Handler消息机制
- Android消息机制之Handler
- Android消息机制之Handler
- Android之Handler消息机制
- Android消息传递之Handler消息机制
- Android消息传递之Handler消息机制
- Android消息传递之Handler消息机制
- Android消息机制之Looper和Handler
- Android开发之Handler消息传递机制
- Android之Handler消息机制详解
- android消息机制之二--Handler
- Android之handler消息传递机制
- Android中的消息机制之Handler
- Android消息处理机制之Handler
- Android源码分析之Handler消息机制
- 正则表达式
- 287. Find the Duplicate Number
- Gambit 5.调试
- Echart-3 学习总结
- css的hover事件 鼠标滑过让该元素的子元素或者其他元素演示该表
- Android之Handler消息机制
- 异步请求 ajax的使用详解
- SlideDateTimePicker 源码学习
- 10种简单的Java性能优化
- Java中的mysql事务处理
- 手把手教你使用UICollectionView写公司的项目
- JavaScript趣题:循环计数器
- 基线安全与linux基线加固方法
- POJ2033 动态规划