Android之Handler源码分析(第四篇:分派消息与处理消息)

前言

    使用Handler将Message对象插入到MessageQueue后,Looper会将Message从MessageQueue中取出,交给发送Message的Handler进行处理,下面的两个方法,是Message抵达Handler后,被调用的方法,我们一起学习一下

Message对象会先被传递到dispatchMessage()方法中

Message对象会派发到handleMessage()方法中 

 

dispatchMessage()方法分析

    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

dispatchMessage()方法是Looper从MessageQueue中取出Message传递给Handler对象进行处理的唯一被调用的方法,Message对象传递到这个方法后,会根据Message对象的状态,执行到不同的方法,我们一起学习一下。

dispatchMessage()方法涉及3种可能的业务逻辑

一、检查传入的Message对象持有的callback

判断传入的Message对象的callback字段是否为null,还记得callback指向的是什么对象吗?callback指向的是Handler的post()系列方法中传入的Runnable对象,所以Handler的post()系列方法提交的Message对象会走到这个代码块里面,此时会再将Message对象传入一个handleCallback()方法中进行处理

二、处理Message对象持有的callback为null时的情况,这里面又会有2种业务逻辑

1、Handler对象实际持有一个mCallback对象

当Handler对象持有的mCallback不为null时,记得mCallback指向的是一个什么对象吗?当我们在创建Handler对象时,构造方法可以传入一个Callback对象会被mCallback持有,Calback是一个interface,内部只定义了一个接口方法,创建的Callback子类对象一会重写其中的handleMessage()方法,回调Callback对象的handleMessage()方法后,并将Message对象传了进去,当handleMessage()方法执行完毕后会检查它的返回值,若为true则会直接return,后面的语句将得不到执行

2、Handler对象持有的mCallback指向一个null或者Callback对象的handleMessage()方法返回false时

就会执行我们经常重写的Handler对象的handleMessage()方法

 

handleCallback()方法分析

 

    private static void handleCallback(Message message) {
        message.callback.run();
    }

用于处理Message对象持有一个Runnable对象(callback指向Runnable对象)的方法

1、直接调用了Message对象持有的Runnable对象的run()方法,这样我们每次提交的Runnable对象,重写的run()方法就会得到执行了(作者写的太好了)

 

handleMessage()方法分析

    public void handleMessage(Message msg) {
    }

原来在Handler中,这个handleMessage()什么也么有做(空实现),我们的子类重写的就是这个方法,传入的参数为Message对象

 

Callback接口

    public interface Callback {
        public boolean handleMessage(Message msg);
    }

一个定义在Handler类中的静态内部接口,只定义了一个接口方法,即handleMessage(Message)方法,Handler对象常常可以持有一个Callback对象,当然取决于我们是否传入这个Callback对象!

 

总结

1、在dispatchMessage()方法中,Handler对象持有的mCallback的handleMessage()方法的返回值会影响Handler中handleMessage()方法的执行

2、当你使用Hander对象时,重写了handleMessage()方法,且又给Handler对象传入一个Callback对象,而Callback对象的handleMessage()方法的返回值又是true,那么你重写的Handler对象的handleMessage()方法将不会得到执行

3、dispatchMessage()方法中,最先可能执行的是Message对象持有的callback(一个Runnable对象),然后是Handler对象持有的mCallback的handleMessage()方法(一个Callback对象),最后才是Handler对象的handleMessage()方法

4、Handler的post系列方法发出的Message是最有可能最优先执行的(因为Message对象会持有一个Runnable对象)、次高执行的是Handler传入的Callback对象、执行优先级最低的是Handler对象重写的handleMessage()方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android中的Handler是一种消息处理机制,它可以用来处理线程之间的通信。当一个线程需要向另一个线程发送消息时,可以通过Handler消息发送到目标线程的消息队列中,目标线程再从消息队列中取出消息进行处理。通过Handler,我们可以实现线程之间的通信和协作,从而提高应用程序的性能和响应速度。 ### 回答2: Android中的Handler是一个非常重要的概念,它可以用于处理线程间的通讯以及异步任务的处理。本文将详细介绍AndroidHandler的概念及如何使用Handler处理消息。 一、Hanlder概念 HandlerAndroid的一个消息处理机制,通过它我们可以传递和处理消息。它通常与MessageQueue和Looper一起使用,MessageQueue用来存放消息,Looper用来处理MessageQueue中的消息Handler则是用来发送和处理消息的,它是与Looper绑定在一起的,可以在任何线程中创建,用来发送消息到绑定的Looper所在的线程中。 二、Handler使用 1. Handler的创建 Handler的创建可以在主线程中,也可以在子线程中。在主线程中,系统已经创建了主线程的Looper,可以直接使用,无需再创建。在子线程中,需要先创建Looper,然后再创建Handler。 2. Handler的发送消息 使用Handler发送消息的方式有三种:post(Runnable r)、sendMessage(Message msg)和sendEmptyMessage(int what)。 post(Runnable r):表示在Handler所在线程的消息队列中插入一个Runnable对象,这个Runnable对象可以是任何实现了Runnable接口的类。 sendMessage(Message msg):表示向Handler所在线程的消息队列中插入一个Message对象,可以在Message对象中携带自定义数据。 sendEmptyMessage(int what):表示向Handler所在线程的消息队列中插入一个Message对象,这个Message对象里面不携带任何数据。 3. Handler处理消息 如果需要对发送的消息进行处理,则必须重写Handler的handleMessage(Message msg)方法,并在该方法中对不同类型的消息进行处理。 三、常见问题 1. Handler引起的内存泄漏 由于Handler处理消息时会持有外部对象的引用,如果这个外部对象被销毁了,但Handler没有被销毁,就可能造成内存泄漏。解决方法是使用静态内部类或弱引用方式创建Handler对象,使Handler对象与外部对象解耦,防止内存泄漏。 2. 跨线程通讯 Handler仅在发送消息处理消息时是线程安全的,但必须要保证发送消息处理消息的Looper在同一线程,否则会抛出异常。 3. 子线程中使用Handler 子线程中使用Handler需要先创建一个Looper,这个Looper必须在子线程中创建,否则会抛出异常。 四、总结 通过本文的介绍,我们了解了AndroidHandler的概念、使用和常见问题。HandlerAndroid中非常重要的一个消息处理机制,可以用于处理线程间通讯和异步任务的处理。我们在使用Handler时必须注意内存泄漏问题,保证发送消息处理消息的Looper在同一线程,同时在子线程中使用Handler需要先创建Looper。 ### 回答3: Android HandlerAndroid 系统中一个非常重要的消息处理机制,它主要用于在子线程中更新 UI 界面,或者在不同的线程之间进行通信。在 Android 应用程序中,UI 界面和后台逻辑通常都在不同的线程中运行,如果直接在子线程中对 UI 进行更新,就会导致应用程序出现 ANR(Application Not Responding)异常。 因此,Android 系统提供了 Handler 消息处理机制,通过 Handler,在不同的线程中进行通信,让子线程可以更新 UI 界面或者在主线程中执行任务,从而避免 ANR 异常的发生。 在使用 Handler 进行消息处理时,首先需要定义一个 Handler 对象,在这个对象中实现消息处理的方法,通常我们称之为 handleMessage() 方法。handleMessage() 方法会接收一个 Message 对象,该对象中包含了传递过来的数据和信息,我们可以在 handleMessage() 方法中对这些信息进行处理并更新 UI 界面。 当子线程需要向主线程发送消息时,可以通过 Handler 对象中的 sendMessage() 方法来发送消息,在主线程中通过 handleMessage() 方法来接收和处理这些消息。 另外,Handler 还支持定时发送和延时发送消息的功能,可以通过 postDelayed() 和 sendMessageDelayed() 方法来实现。这些方法可以让我们在需要的时候发送消息,并且可以延时执行或者定时执行。 需要注意的是,在使用 Handler 时,需要注意线程安全问题,如果在主线程中直接对 UI 进行更新,可能会出现线程安全问题,因此建议将消息发送到主线程中进行处理。 总之,Android Handler 消息处理机制是实现异步消息通信和更新 UI 界面的非常重要的工具,它可以帮助开发者更好地进行线程间通信,避免 ANR 异常的发生,提高应用程序的稳定性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值