Handler深入解析(二)
来源:互联网 发布:网络视频监控系统优势 编辑:程序博客网 时间:2024/05/29 02:52
上一节讲了Handler的构造和消息发送,这一节继续Handler的消息移除和消息处理。
一、消息移除
消息移除就是讲Message从MessageQueue中移除。先上代码:
public final voidremoveMessages(intwhat) {
mQueue.removeMessages(this, what,null);
}
public final voidremoveMessages(intwhat, Object object) {
mQueue.removeMessages(this, what, object);
}
public final voidremoveCallbacks(Runnable r)
{
mQueue.removeMessages(this, r,null);
}
public final voidremoveCallbacks(Runnable r, Object token)
{
mQueue.removeMessages(this, r, token);
}
public final voidremoveCallbacksAndMessages(Object token) {
mQueue.removeCallbacksAndMessages(this, token);
}
主要是通过与Handler关联的Looper的MessageQueue来移除消息,因为是通过Handler来发送消息,且和Handler绑定,所以在Handler中移除,但处理上没Handler啥事。就不多说,后期讲解到Looper和MessageQueue时会做出说明!和消息移除和消息发送相关还有消息判断,主要可用的有两种:
public final booleanhasMessages(intwhat) {
return mQueue.hasMessages(this, what,null);
}
public final booleanhasMessages(intwhat, Object object) {//低版本好像没有
return mQueue.hasMessages(this, what, object);
}
最终也都是通过消息队列(MessageQueue)来处理!
Handler还提供了获取关联Looper的方法:
public finalLooper getLooper() {
return mLooper;
}
因为MessageQueue是和Looper绑定的,所以获取MessageQueue是通过Looper来获取,Handler也就没有提供对应的方法,从MessageQueue的初始化也可以看出!
二、消息处理
终于说到消息处理,我们用到的消息处理无外乎两种,实现Callback接口,在接口方法handleMessage中处理返回的消息:
public interfaceCallback {
public boolean handleMessage(Message msg);
}
或者Handler的默认方法handleMessage中处理:
public voidhandleMessage(Message msg) {
}
这两种唯一的不同在于是否有返回结果,其他一样!
我们先来看看什么时候调用到了这个方法:
public voiddispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback!=null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
唯一的消息分发事件有调用,但是开始的if判断是什么鬼?先看看调用的handleCallback方法:
private static voidhandleCallback(Message message) {
message.callback.run();
}
再深入到Message就知道了这个callback是Message的全局包变量Runnable的变量名,因为Runnable的特性(执行后自动销毁),防止未处理的事件直接返回!再看else后面的消息调用,是先调用Callback的接口方法,为空或者没有执行,则调用Handler的handleMessage方法处理。那么这个方法是谁再调用呢?首先和Handler相关的也就Looper和Message了(MessageQueue是和Looper绑定的,与Handler关系不紧密),而handleCallback的参数又有Message,所以只能是Looper回调了,具体的调用方法是loop,这里就不详细说了!
这篇比较简洁,Handler的讲解主要涉及Handler的初始化,消息发送、消息移除和消息处理,没有像网上那样把Looper、Message、MessageQueue放在一起,主要集中在Handler本身,下一期讲解Message,也是这种模式,等这几个关联类讲解完了再做一个总结!
- Handler深入解析(二)
- Handler深入解析(一)
- Handler机制深入解析
- 深入了解Handler消息机制(二)
- Handler消息机制源码解析(二)
- Android中Handler源码解析(二)
- android handler机制源码解析(二)
- Handler、Looper、MessageQueue深入解析
- Android的Handler深入解析
- Android Handler 异步消息处理机制二:源码解析,深入理解Looper、Handler、Message三者关系
- 《深入解析ATL》笔记(二)
- Android 深入解析光传感器(二)
- 深入JavaScript(二)之解析机制
- JVM较深入解析(二)
- 深入JavaScript(二)之解析机制
- 深入理解Android解析xml(二)
- 深入HBase架构解析(二)
- 深入HBase架构解析(二)
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- pywin32应用——python在windows下系统编程初步
- 数据库编程
- Reverse-Interger
- 数据库操作练习10
- Handler深入解析(二)
- namespace、autoload、sql_autoload_register、PSR-4
- Java基础之程序设计基础
- 前端
- pytorch学习总结
- flask 传参
- Spring框架学习(二)
- hibernate--Student_Course_Score设计
- ubuntu16.04 Python2和Python3同时存在安装flask框架