美文网首页
Handler的异步消息处理运行机制,线程间通信

Handler的异步消息处理运行机制,线程间通信

作者: JerryloveEmily | 来源:发表于2017-11-05 21:48 被阅读73次

一、引言

Android开发中总是免不了处理一些耗时的操作,如网络请求、IO文件读写等等,都需要用子线程来处理,耗时操作往往也伴随着更新UI的显示。此时就涉及到UI线程与子线程之间的通信问题。为此Android系统引入了Handler异步消息处理的机制。

二、在子线程中更新UI

Android中想要在子线程中更新UI,通常有三种办法:

  1. Handler的post方法
  2. View视图控件的post方法
  3. Activity的runOnUiThread()方法

Handler的post方法,应该都很清楚,内部的Runnable的run方法已经是在UI线程执行了。View的post方法、Activity的runOnUiThread()方法怎么也可以在UI线程呢,来看看其内部实现:

// View.java
public boolean post(Runnable action) {
    final AttachInfo attachInfo = mAttachInfo;
    if (attachInfo != null) {
        return attachInfo.mHandler.post(action);
    }

    // Postpone the runnable until we know on which thread it needs to run.
    // Assume that the runnable will be successfully placed after attach.
    getRunQueue().post(action);
    return true;
}

// Activity.java
public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

很显然从源码可以看出最终都是交给主线程Handler的post方法来处理。那么为什么主线程声明实例化的Handler的post方法在子线程调用就可以用来更新UI呢?这个问题暂时先放这里。接下来进一步分析Handler。

三、Handler的消息处理机制

在Handler的消息处理架构中,和Message、MessageQueue、Looper这三个类是紧密相连的。
Message:消息数据承载类,可以是事件任务消息,也可以是其它的实体数据消息。
MessageQueue:消息队列。用于将消息入队和出队,以及消息从队列删除释放的管理。
Looper:消息循环处理器。用于维持一个死循环不断的从MessageQueue中取出消息,并将消息分发给设置的目标对象处理(target即Handler)。
Handler:它是整个机制的辅助类。也是提供给客户端使用对外暴露Api。用于辅助把消息加入队列、删除释放消息事件和消息的回调处理。

Handler中我们最常用的有post()、postDelay()、sendMessage()等方法,直接或者间接的在内部构建一个Message消息对象然后通过MQ(MessageQueue)的enqueueMessage来处理消息入队的工作。App启动的时候在ActivityThread类的main方法里就先通过prepareMainLooper方法预加载了一个Looper对象,然后通过loop方法开启了消息循环器。

// ActivityThread.java
public static void main(String[] args) {
    ...
    Looper.prepareMainLooper();
    ActivityThread thread = new ActivityThread();
    thread.attach(false);
    ...
    Looper.loop();
    ...
}

以上的Looper对象是主线程的,因此构造的MQ消息队列也是主线程的,loop()方法中不断循环取出队列中的消息,通过handler的dispatchMessage方法分发消息。当然从一个事件消息的发送入队到出队处理回调不一定是实时的,MQ的enqueueMessage和next方法可以看出它是一个单向链表队列,入队的时候根据消息发送的时间when按升序排序,当when为0时插入到队列头部。

Handler异步消息处理运行机制原理图

相关文章

  • 学习总结Handler机制原理

    Handler Android开发过程中,易用于线程间通信Handler主要用于异步消息的处理:当发出一个消息之后...

  • Handler的异步消息处理运行机制,线程间通信

    一、引言 Android开发中总是免不了处理一些耗时的操作,如网络请求、IO文件读写等等,都需要用子线程来处理,耗...

  • Android Handler

    Handler 作用 Android 中的Handler 主要用于主线程与子线程之间的通信,也就是处理异步消息。简...

  • 2018-12-07 Handler机制

    简介 Handler用于线程间的通信,即异步消息的处理,比如子线程下载文件/图片,完成后通知主线程UI更改等等。h...

  • Handler知识点汇总

    Handler说明: Android开发中可以使用Handler发送消息进行线程间的通信。Handler发送并处理...

  • Android基本知识

    1、Android的Handler运行机制 1. Message Message消息,理解为线程间交流的信息,处理...

  • Handler 的工作原理

    参考资料gityuan 一、Handler原理 Handler 是 Android 中线程间通信的组件。在异步线程...

  • Android的同步和异步理解

    在Android的API当中handler消息处理、Broadcast广播消息等均采用异步通信机制。什么是异步通信...

  • handler机制和流程简单理解

    handler机制,即Android的消息处理机制,主要用于Android线程间通信,主线程更新UI,发送消息,处...

  • Android Handler sendMessage 和 po

    Handler介绍 Handler主要用于异步消息的处理:创建于主线程并从属于主线程的 Handler ,在子线程...

网友评论

      本文标题:Handler的异步消息处理运行机制,线程间通信

      本文链接:https://www.haomeiwen.com/subject/gmehmxtx.html