`
stone02111
  • 浏览: 215205 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深度解析Handler类,以及HandlerThread

 
阅读更多

Handler,HandlerThread下次再写;
1)核心成员变量:
final MessageQueue            mQueue;//消息队列,通过Loooper拿到的;
final Looper                                   mLooper;//消息泵,管理消息队列,通过形参传入,我是主线程的Looper;
inal Callback                                   mCallback;//handle的定义的一个内部接口,也是用来接收消息的;

2)核心成员函数;
public interface Callback {//一个回调接口,Handler带一个成员变量,可以通过构造函数的形参传入;
        public boolean handleMessage(Message msg);
    }

**
     * 子类可以继承此方法,用来处理消息;
     */
    public void handleMessage(Message msg) {
    }


   /**
     * 内部派发消息,
*  就是looper这个消息泵的loop()循环方法中通过封装在meesge的handler调用的;
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) //如果消息包含动作,直接指向runnable的方法;
        {
                //运行msg里面的Runnable;
            handleCallback(msg);
        } 
        else 
        {
//判断自身的mCallback,也就是是否有回调监听;
            if (mCallback != null)
            {
                //注意这里的表示,如果不是返回ture的话,还是会调用子类重载的方法;
                    if (mCallback.handleMessage(msg)) //回调;
                {
                    return;//注意这里的返回;
                }
            }
            handleMessage(msg);//调用子类的方法,也就是我们常用的,通过extends handler继承的得到的处理消息的方法;
        }
    }

构造函数1)无参:
    public Handler() {
   //获取当前线程的messageQuenue管理者looper;
        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                    //handler对象须有一个对应的Looper;
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        //获取消息队列;
        mQueue = mLooper.mQueue;//获取消息队列;
        //置null回调;
        mCallback = null;
    }

    /**
     * 构造函数2)带回调监听;
     */
    public Handler(Callback callback) {
        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
    }


    /**
     *  构造函数3)用提供的looper管理者替换默认的;
     */
    public Handler(Looper looper) {
        mLooper = looper;
        mQueue = looper.mQueue;
        mCallback = null;
    }


    /**
     *  构造函数4)替代looper和接口监听;
     */
    public Handler(Looper looper, Callback callback) {
        mLooper = looper;
        mQueue = looper.mQueue;
        mCallback = callback;
    }

  /**
     * 获取消息成员方法,还有很多,实际都是通过Message类获取的;
     */
    public final Message obtainMessage(int what)
    {
        return Message.obtain(this, what);
    }

非常重要的一个方法:
    /**
     *通过Handler post一个任务runnable到消息队列;
     */
    public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }

我们分析一下怎么实现的:
1.通过:sendMessageDelayed(getPostMessage(r), delayMillis);
2.getPostMessage(r)的作用就是发挥一个带runnable的Meesage;
    /**
     * 建造带runnable的Msg;
     */
    private final Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;//看到没有,Message的一个成员方法,后续我们会分析Message的;
        return m;
    }
这里Message携带了一个runnable,有什么用了?回到dispatchMessage方法,处理消息的第一步就是处理的msg的run方法;
这样就到达了post一个任务进去的目的;
    /**
     * 运行message.callbakc也就是Runnable的run()方法;
     */
    private final void handleCallback(Message message) {
        message.callback.run();
    }


Handler的消息发送,非常核心的方法,就是通过 MessageQueue 的成员方法把msg插入队列;
    /**
     * 核心方法,基本所有的消息发送都是通过这个方法;
     * 发送一个指定时间的消息;
     */
    public boolean sendMessageAtTime(Message msg, long uptimeMillis)
    {
        boolean sent = false;
        MessageQueue queue = mQueue;
        if (queue != null) {
            msg.target = this;
            sent = queue.enqueueMessage(msg, uptimeMillis);
        }
        else {
            //抛出运行时异常;
            RuntimeException e = new RuntimeException(
                this + " sendMessageAtTime() called with no mQueue");
            Log.w("Looper", e.getMessage(), e);
        }
        return sent;
    }

辅助方法,主要是清除掉msg消息和callback.因为有个时候退出的时候,或是取消的时候,需要清除前面的方法;
    /**
     * 清楚消息队列中所有what标识的消息;
     */
    public final void removeMessages(int what) {
        mQueue.removeMessages(this, what, null, true);
    }

分享到:
评论

相关推荐

    Looper、Handler与HandlerThread

    在Android开发中,Looper、Handler和HandlerThread是三个非常重要的组件,它们构成了Android消息处理机制的基础,用于在主线程中处理来自其他线程的消息。理解并熟练运用这三个组件,对于编写高效、响应迅速的...

    HandlerThread

    【HandlerThread】是一种在Android系统中专为处理后台任务而设计的线程类。它继承自`Thread`,并结合了`Looper`和`Handler`的概念,使得开发者可以在子线程中创建一个消息循环,方便地处理来自主线程或其他线程的...

    Android HandlerThread 全面解析

    本文将全面解析`HandlerThread`的工作原理、使用方法以及它在实际开发中的应用。 1. **`HandlerThread`简介** `HandlerThread`是Android中的一个内置类,它继承自`Thread`,并添加了`Looper`和`Handler`的支持。...

    Android:Handler学习实例2(HandlerThread、Bundle传递参数)

    HandlerThread handlerThread = new HandlerThread("handler_thread"); //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法,否则获得的值为空值; handlerThread.start(); //创建...

    HandlerThread,AsyncTask,Handler的一个小例子

    本示例探讨了三种不同的方法——HandlerThread、AsyncTask以及Handler,它们都是用来在后台线程处理耗时操作并更新UI(主线程)的有效手段。下面我们将深入理解这三个概念及其在进度条更新中的应用。 首先,...

    Thread、Handler和HandlerThread关系详解

    对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)...

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    HandlerThread的使用与自定义HandlerThread

    本文将深入探讨 `HandlerThread` 的使用、工作原理,并讲解如何自定义 `HandlerThread`,以及为什么在某些场景下我们需要使用它。 `HandlerThread` 是 Android SDK 提供的一个特殊线程类,它的核心功能是结合了线程...

    了解Android核心:Looper,Handler和HandlerThread

    在Android开发中,理解核心组件如Looper、Handler和HandlerThread对于构建高效且响应式的用户界面至关重要。这些组件共同协作,确保UI线程不被阻塞,从而提供流畅的用户体验。 首先,主线程(也称为UI线程)是...

    mybatis3.x源码深度解析与最佳实践.pdf

    MyBatis 3.x 源码深度解析与最佳实践 MyBatis 是当前最流行的 Java 持久层框架之一,其通过 XML 配置的方式消除了绝大部分 JDBC 重复代码以及参数的设置,结果集的映射。为了更好地学习和理解 MyBatis 背后的设计...

    android HandlerThread 使用demo

    2. **创建Handler**:创建一个与`HandlerThread`的`Looper`关联的`Handler`,用于接收和处理消息。 3. **发送消息**:在需要执行后台任务的地方,使用`Handler`的`sendMessage()`或`post()`方法发送消息。 4. **处理...

    HandlerThread使用demo

    这个项目可能包括创建HandlerThread,创建Handler,以及在主线程和其他线程之间发送消息的代码。通过研究这个示例,开发者可以更深入地理解HandlerThread的工作原理和应用场景。 总之,HandlerThread是Android多...

    android HandlerThread 实例

    这通常包括创建 `HandlerThread` 对象、启动线程、创建与线程关联的 `Handler`,以及在其他线程中发送消息到 `Handler` 进行处理的过程。 总的来说,`HandlerThread` 是 Android 平台中处理后台任务的一种高效手段...

    防止ANR错误HandlerThread多线程解决耗时操作MyProject.zip

    HandlerThread是Android提供的一个用于在后台线程执行任务的类,它是基于Thread和Looper的。在Android中,主线程负责处理UI更新和用户交互,因此不应在主线程中执行耗时操作,否则可能导致ANR。使用HandlerThread...

    handlerthread学习demo

    `HandlerThread` 的工作原理与普通的线程有所不同,它结合了`Handler`、`Looper` 和 `MessageQueue`,使得开发者可以在单独的线程中处理消息,避免阻塞主线程,提高应用程序的响应速度。 描述中的"handlerthread做...

    Hanlder、HandlerThread、AsyncTask处理机制的相关Demo代码

    `Handler`、`HandlerThread`和`AsyncTask`都是Android系统提供的处理异步任务的机制,它们各自有其特点和适用场景。下面我们将分别详细介绍这三个组件,并通过相关Demo代码来理解它们的工作原理。 ### 1. Handler...

    HandlerThread的使用以及注意事项

    HandlerThread的使用以及注意事项

Global site tag (gtag.js) - Google Analytics