Handler机制
来源:互联网 发布:fastjson解析多层json 编辑:程序博客网 时间:2024/05/22 19:16
Handler提供两种方式发送消息: post(runnable) 、 sendMessage(msg) , post 方式实现上也是通过 sendMessage 方法将消息发送出去的,区别在于 post 方法会先调用getPostMessage(runnable) 并将参数 runnable 赋值给创建好的 Message 对象的成员 callback 然后再调用 sendMessage(msg) 将消息发送出去;代码
public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); }private static Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m; }
注:sendMessage 内部是调用 sendMessageDelayed 方法
sendMessage(msg) 方法会先为传入的 msg 添加 target (即当前Handler),然后将这条消息通过 MessageQueue 的 enqueueMessage(msg) 方法添加到MessageQueue中( MessageQueue 用单链链表存储消息,对外提供 enqueueMessage(msg) 方法用于添加以及 next() 方法用于获取和移除消息);
Handler 只能在有 Looper 的线程中发送消息, Looper 是一个无限循环,用于从 MessageQueue 中取消息, Looper 中的 loop() 方法通过调用 MessageQueue 的 next 方法循环从 MessageQueue 中获取消息,获取到消息后调用 msg.target.dispatchMessage(msg) 将消息交给 Handler 处理, Handler 的处理逻辑:
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
首先判断 msg 的 callback 是否为空,这个 callback 就是 Handler 的 post(Runnable runnable) 方法传入的 runnable ,如果 msg.callback 不为空(即Handler通过post方法发送的消息)则调用 handleCallback(msg) 该方法中会回调 Runnable 的 run() 方法, msg.callback 为空的话则会判断 mCallback 是否为空, mCallback 是 Callback 的对象( Handler提供 Handler(Callback callback) 初始化方式,这种方式可以用来创建一个 Handler 的实例但并不需要派生 Handler 的子类。在日常开发中,创建 Handler 最常见的方式就是派生一个 Handler 的子类并重写其 handleMessage 方法来处理具体的消息,而 Callback 给我们提供了 另外一种使用 Handler 的方式,当我们不想派生子类时,就可以通过 Callback 来实现),当 mCallback 不为空时回调 mCallback 的 handleMessage(msg) 方法,否则调用 handleMessage(msg) 方法。
- Handler机制
- Handler机制
- handler机制
- handler机制
- Handler机制
- Handler机制
- handler机制
- Handler机制
- handler机制
- Handler机制
- handler机制
- Handler机制
- Handler机制
- Handler机制
- handler机制
- handler机制
- Handler机制
- Handler机制
- Wireshark抓包实例诊断TCP连接问题
- 分析内存的使用情况(内存泄露)
- 当前技术栈及待填坑
- C#读写远程共享文件夹
- C语言 水仙花数
- Handler机制
- 关于一行代码实现两个整型变量值互换的问题
- PS学习_1-软件下载与破解
- druid配置数据库连接使用密文密码
- vue-cli构建项目 npm run build打包后怎么在本地查看效果
- 获取wifi信息
- Jmeter断言/检查点
- maven学习笔记(三) maven的坐标
- 【HDU 1114】Piggy-Bank(DP-完全背包)