【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )

简介: 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )

文章目录

一、Handler 发送与处理消息 ( 两大功能 )

二、Handler 初始化

三、完整 Handler 代码





一、Handler 发送与处理消息 ( 两大功能 )


Handler 有两个功能 :


功能一 : 发送消息到 Looper 中的 消息队列 MessageQueue 中 ;


 

/**
     * 发送消息
     * @param msg
     */
    public void sendMessage(Message msg){
        // 为消息设置发送的 Handler
        msg.target = this;
        // 向消息队列中放入要执行的消息
        mQueue.enqueueMessage(msg);
    }


功能二 : 接收 Looper 中的 loop 方法传来的 Message , 并 执行该 Message 代表的任务 ;



Handler 执行 Message 任务 , 具体的执行逻辑需要 用户实现 ; 用户创建 Handler 时 , 需要覆盖 handleMessage 方法 , 在重写的方法中处理不同的 Message 任务 ;


 

/**
     * 执行消息对应的任务
     * @param next
     */
    public void handleMessage(Message next) {
    }






二、Handler 初始化


Handler 初始化 :


Handler 的功能一 发送消息 , 就是向 消息队列 MessageQueue 中发送消息 , 并将消息放到 MessageQueue 中的 Message 链表队列的最后一个 ;


这就需要 Handler 持有 消息队列 MessageQueue 的引用 ,


消息队列封装在 Looper 中 , 因此需要先拿到 线程本地变量 Looper , 然后从 Looper 中获取对应的消息队列 ;



这里就需要特别注意 , 在初始化 Handler 时 , 需要用到 Looper , 如果 Looper 为空 , Handler 初始化就会失败 ;


因此在 创建 Handler 之前 , 必须先调用 Looper 的 prepare 方法 , 先将 Looper 进行初始化操作 ;



 

/**
     * 消息队列
     * 该消息队列封装在 Looper 中
     * Looper 封装在线程本地变量中
     */
    MessageQueue mQueue;
    public Handler(){
        /*
            在 Handler 中需要拿到 Looper
            进而拿到 Looper 中的 MessageQueue 消息队列
            Handler 的操作就是将 Message 放入 MessageQueue
            因此在 Handler 中需要持有 MessageQueue 消息队列的引用
            获取 Looper 时 , Looper 必须已经初始化完毕,
            也就是已经调用过 prepare 创建了 Looper 并将其放入了线程本地变量
         */
        // 获取当前线程中的 线程本地变量 Looper
        Looper looper = Looper.looper();
        // 获取封装在 Looper 中的 消息队列 MessageQueue
        mQueue = looper.mQueue;
    }






三、完整 Handler 代码


package kim.hsl.handler;
public class Handler {
    /**
     * 消息队列
     * 该消息队列封装在 Looper 中
     * Looper 封装在线程本地变量中
     */
    MessageQueue mQueue;
    public Handler(){
        /*
            在 Handler 中需要拿到 Looper
            进而拿到 Looper 中的 MessageQueue 消息队列
            Handler 的操作就是将 Message 放入 MessageQueue
            因此在 Handler 中需要持有 MessageQueue 消息队列的引用
            获取 Looper 时 , Looper 必须已经初始化完毕,
            也就是已经调用过 prepare 创建了 Looper 并将其放入了线程本地变量
         */
        // 获取当前线程中的 线程本地变量 Looper
        Looper looper = Looper.looper();
        // 获取封装在 Looper 中的 消息队列 MessageQueue
        mQueue = looper.mQueue;
    }
    /**
     * 发送消息
     * @param msg
     */
    public void sendMessage(Message msg){
        // 为消息设置发送的 Handler
        msg.target = this;
        // 向消息队列中放入要执行的消息
        mQueue.enqueueMessage(msg);
    }
    /**
     * 执行消息对应的任务
     * @param next
     */
    public void handleMessage(Message next) {
    }
}




目录
相关文章
|
Android开发
Android Socket通讯 之 心跳消息
Android Socket通讯 之 心跳消息
230 0
Android Socket通讯 之 心跳消息
|
Android开发
Android Socket通讯 分离服务端和客户端、发送表情消息
Android Socket通讯 分离服务端和客户端、发送表情消息
148 0
Android Socket通讯 分离服务端和客户端、发送表情消息
|
消息中间件 存储 安全
深入理解Android消息机制
深入理解Android消息机制
928 6
|
Android开发
Android 在应用图标上设置未读消息数量
Android 在应用图标上设置未读消息数量
1256 2
|
XML 安全 API
你真的懂android通知消息吗?
你真的懂android通知消息吗?
560 0
你真的懂android通知消息吗?
|
JSON API 开发工具
XPush 一个轻量级、可插拔的Android消息推送框架
XPush 一个轻量级、可插拔的Android消息推送框架
445 0
XPush 一个轻量级、可插拔的Android消息推送框架
|
Android开发
Android开发案例 点击按钮出现 简易的消息提示框
Android开发案例 点击按钮出现 简易的消息提示框
300 0
Android开发案例 点击按钮出现 简易的消息提示框
|
XML 编解码 Java
Android 消息推送:个推
集成失败原因: 1、检查自己的APPID等信息 2、检查自己的.jar和.so文件 3、检查AndroidManifest.xml
627 0
|
消息中间件 存储 算法
【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
265 0
|
消息中间件 Android开发
【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )
【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )
165 0

热门文章

最新文章