【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) {
    }
}




目录
相关文章
|
26天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
22 1
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
28 2
|
3月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
36 3
|
3月前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
38 0
|
Android开发 数据库
|
5天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。