文章目录
- 一、``和`handleMessage`方法的关系
- 二、消息处理的顺序和逻辑
- 三、总结
在Android中,
Handler
类有两种处理消息的方法:通过实现
接口和通过覆盖
Handler
类的
handleMessage(Message msg)
方法。了解这两种方法的交互关系对于理解消息处理流程非常重要。
一、
和handleMessage
方法的关系
-
接口:
- 当创建
Handler
实例时,可以传递一个实现了接口的对象。
-
Callback
接口有一个方法:boolean handleMessage(Message msg)
。如果实现此接口的对象被传递给Handler
,在消息到达时,Handler
会首先调用这个handleMessage
方法。
public interface Callback { boolean handleMessage(Message msg); }
- 1
- 2
- 3
- 当创建
-
方法:
-
Handler
类有一个可以覆盖的handleMessage
方法。 - 如果没有传递
Callback
对象,或者方法返回
false
,Handler
会调用其自身的handleMessage
方法来处理消息。
public void handleMessage(Message msg) { // Override this to handle messages }
- 1
- 2
- 3
-
二、消息处理的顺序和逻辑
-
优先调用
:
- 当消息到达时,
Handler
会首先检查是否有Callback
对象。 - 如果有
Callback
对象,Handler
会调用(Message msg)
方法。
@Override public void dispatchMessage(Message msg) { if (msg.callback != null) { // 1. 设置了 (Runnable) msg.callback.run(); } else { if (mCallback != null) { // 2. 设置了 (Callback) if (mCallback.handleMessage(msg)) { return; } } // 3. 未设置 或者 返回 false handleMessage(msg); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 当消息到达时,
-
返回
true
:- 如果
方法返回
true
,表示消息已经被处理,Handler
不会继续调用其自身的handleMessage
方法。 - 这样可以通过
Callback
接口实现对消息的优先处理,且能够阻止后续的处理流程。
if (mCallback != null) { // 2. 设置了 (Callback) if (mCallback.handleMessage(msg)) { return; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 如果
-
返回
false
:- 如果
方法返回
false
,表示消息没有被完全处理或需要进一步处理。 -
Handler
会继续调用其自身的handleMessage
方法。
// 3. 未设置 或者 返回 false handleMessage(msg);
- 1
- 2
- 如果
三、总结
- 如果
Handler
的Callback
存在且handleMessage(Message msg)
方法返回true
,那么Handler
的handleMessage
方法将不会执行。 - 如果
返回
false
或Callback
不存在,Handler
的handleMessage
方法才会被调用。
通过这种设计,可以灵活地选择不同的消息处理策略,并且在某些情况下可以通过Callback
实现优先级更高的消息处理,避免不必要的重复处理。