zoukankan      html  css  js  c++  java
  • 在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系

    Message,信息的载体,用来传递数据给Handler。

    Handler (Handler处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理)
    发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联。
    Handler和创建它的线程绑定在一起,把 Message和Runable 对象传递给 MessageQueue,这些对象离开 MessageQueue 时,Handler 负责执行他们。

    Handler有两个主要的用途:
    (1)确定在将来的某个时间点执行一个或者一些 Message和Runnable 对象。
    (2)在其他线程(不是 Handler 绑定线程)中排入一些要执行的动作。

    post(Runnable):Runnable 在 handler 绑定的线程上执行,也就是说不创建新线程。
    postAtTime(Runnable,long):
    postDelayed(Runnable,long):
    sendEmptyMessage(int):
    sendMessage(Message):
    sendMessageAtTime(Message,long):
    sendMessageDelayed(Message,long):

    sendMessage这个动作把 Message对象排成队列,这些 Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.
    handlerMessage(Message)必须由 Handler 的子类来重写。

    post 这个动作把 Runnable 对象排入 MessageQueue,MessageQueue 收到这些消息的时候以一定的排序执行他们

    当 posting 或者 sending 到一个 Hanler 时,你可以有三种行为: 当 MessageQueue 准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现 timeout,tick,和基于时间的行为。

    创建一个新进程时,主线程自带一个MessageQueue,它管理顶层的应用对象和主线程创建的窗体。

    MessageQueue:(Message Queue 消息队列,用来存放通过 Handler 发布的消息,按照先进先出执行。)
    包含message列表的底层类,Looper负责分发这些message。message并不是直接加到MessageQueue中,而是通过MessageQueue.IdleHandler 关联到 Looper
    可以通过 Looper.myQueue()从当前线程中获取 MessageQueue

    每个 message queue 都会有一个对应的 Handler。Handler 会向 messagequeue 通过
    两种方法发送消息:sendMessage 或 post。这两种消息都会插在 message queue 队尾并
    按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过 sendMessage
    发送的是一个 message 对象,会被 Handler 的 handleMessage()函数处理;而通过 post 方
    法发送的是一个 runnable 对象,则会自己执行。

    Looper:
    Looper 类被用来执行一个线程中的 message循环。 在线程中调用 prepare()创建一个 Looper, 然后用 loop()来处理 messages, 直到循环终止。
    (Looper 是 Handler 和消息队列之间通讯桥梁,程序组件首先通过 Handler 把消息传递给
    Looper,Looper 把消息放入队列,它也可以取得MessageQueue里的消息,产生消息队列,传递给Handler)
    大多数和 message loop 的交互是通过Handler。

    下面是一个典型的带有 Looper 的线程实现。
    class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
    Looper.prepare();
    mHandler = new Handler() {
    public void handleMessage(Message msg) {
    // process incoming messages here
    }
    };
    Looper.loop();
    }
    }

  • 相关阅读:
    vue后台管理系统——权限管理模块
    vue后台管理系统——用户管理模块
    vue后台管理系统——主页布局
    vue后台管理系统——登录/退出功能
    vue后台管理系统
    kratos 日志请求响应记录
    composer 版本切换
    Nacos搭建并使用
    go micro 搭建微服务
    consul命令行参数
  • 原文地址:https://www.cnblogs.com/jiuqing/p/4138757.html
Copyright © 2011-2022 走看看