【Android面试八股文】Handler的Callback存在,但返回true,handleMessage 是否会执行?

时间:2024-11-17 17:13:04

文章目录

  • 一、``和`handleMessage`方法的关系
  • 二、消息处理的顺序和逻辑
  • 三、总结

在Android中, Handler类有两种处理消息的方法:通过实现 接口和通过覆盖 Handler类的 handleMessage(Message msg)方法。了解这两种方法的交互关系对于理解消息处理流程非常重要。

一、handleMessage方法的关系

  1. 接口:

    • 当创建Handler实例时,可以传递一个实现了接口的对象。
    • Callback接口有一个方法:boolean handleMessage(Message msg)。如果实现此接口的对象被传递给Handler,在消息到达时,Handler会首先调用这个handleMessage方法。
    public interface Callback {
        boolean handleMessage(Message msg);
    }
    
    • 1
    • 2
    • 3
  2. 方法:

    • Handler类有一个可以覆盖的handleMessage方法。
    • 如果没有传递Callback对象,或者方法返回falseHandler会调用其自身的handleMessage方法来处理消息。
    public void handleMessage(Message msg) {
        // Override this to handle messages
    }
    
    • 1
    • 2
    • 3

二、消息处理的顺序和逻辑

  1. 优先调用:

    • 当消息到达时,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
  2. 返回true:

    • 如果方法返回true,表示消息已经被处理,Handler不会继续调用其自身的handleMessage方法。
    • 这样可以通过Callback接口实现对消息的优先处理,且能够阻止后续的处理流程。
    if (mCallback != null) {
     	// 2. 设置了 (Callback)
         if (mCallback.handleMessage(msg)) {
             return;
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. 返回false:

    • 如果方法返回false,表示消息没有被完全处理或需要进一步处理。
    • Handler会继续调用其自身的handleMessage方法。
    // 3. 未设置 或者 返回 false
    handleMessage(msg);
    
    • 1
    • 2

三、总结

  • 如果HandlerCallback存在且handleMessage(Message msg)方法返回true,那么HandlerhandleMessage方法将不会执行。
  • 如果返回falseCallback不存在,HandlerhandleMessage方法才会被调用。

通过这种设计,可以灵活地选择不同的消息处理策略,并且在某些情况下可以通过Callback实现优先级更高的消息处理,避免不必要的重复处理。