Android Handler 机制详解

Handler 是 Android 系统中用于线程间通信的核心机制,它基于消息队列(MessageQueue)和循环器(Looper)实现,主要用于在不同线程间发送和处理消息。

核心组件

  1. Handler:消息的发送者和处理者

    • 发送消息到 MessageQueue
    • 处理从 MessageQueue 取出的消息
  2. MessageQueue:消息队列

    • 以队列形式管理 Message
    • 按时间顺序排列消息
  3. Looper:消息循环

    • 不断从 MessageQueue 取出消息
    • 将消息分发给对应的 Handler 处理
  4. Message:消息载体

    • 包含消息内容和处理者信息

工作原理

  1. 主线程的 Looper 准备

    • Android 主线程(UI 线程)在启动时就已经通过 Looper.prepareMainLooper() 初始化了 Looper
    • 开发者无需手动为主线程创建 Looper
  2. 子线程使用 Handler

    java 复制代码
    // 在子线程中
    Looper.prepare(); // 初始化Looper
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // 处理消息
        }
    };
    Looper.loop(); // 开始消息循环
  3. 消息发送流程

    • Handler 发送消息 (sendMessage()post())
    • 消息被加入 MessageQueue
    • Looper 不断循环从 MessageQueue 取出消息
    • 消息被分发回 Handler 的 handleMessage() 处理

常用方法

  1. 发送消息

    • sendMessage(Message msg)
    • sendEmptyMessage(int what)
    • post(Runnable r)
    • sendMessageDelayed(Message msg, long delayMillis)
  2. 处理消息

    • handleMessage(Message msg) (需重写)
  3. 移除消息

    • removeMessages(int what)
    • removeCallbacks(Runnable r)

内存泄漏问题

Handler 使用不当容易引起内存泄漏,常见场景:

  • 非静态内部类 Handler 隐式持有外部类(如 Activity)引用
  • 消息队列中未处理完的消息持有 Handler 引用

解决方案

  1. 使用静态内部类 + WeakReference

    java 复制代码
    private static class MyHandler extends Handler {
        private WeakReference<Activity> mActivity;
        
        public MyHandler(Activity activity) {
            mActivity = new WeakReference<>(activity);
        }
        
        @Override
        public void handleMessage(Message msg) {
            Activity activity = mActivity.get();
            if (activity != null) {
                // 处理消息
            }
        }
    }
  2. 在 Activity 销毁时清除消息

    java 复制代码
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
    }

典型应用场景

  1. 子线程执行耗时任务后更新 UI
  2. 定时任务执行
  3. 延迟任务处理
  4. 不同组件间的通信

Handler 机制是 Android 异步编程的基础,理解其原理对于开发高效、稳定的 Android 应用至关重要。

相关推荐
betazhou1 小时前
mariadb5.5.56在centos7.6环境安装
android·数据库·adb·mariadb·msyql
doublelixin6 小时前
AOSP (Android11) 集成Google GMS三件套
android
xzkyd outpaper9 小时前
onSaveInstanceState() 和 ViewModel 在数据保存能力差异
android·计算机八股
CYRUS STUDIO10 小时前
FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
android·安全·逆向·app加固·fart·脱壳
WAsbry11 小时前
现代 Android 开发自定义主题实战指南
android·kotlin·material design
xzkyd outpaper11 小时前
Android动态广播注册收发原理
android·计算机八股
唐墨12311 小时前
android与Qt类比
android·开发语言·qt
林林要一直努力12 小时前
Android Studio 向模拟器手机添加照片、视频、音乐
android·智能手机·android studio
AD钙奶-lalala12 小时前
Mac版本Android Studio配置LeetCode插件
android·ide·android studio
散人102413 小时前
Android Test3 获取的ANDROID_ID值不同
android·unit testing