找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 387|回复: 1

Android Handler内存泄漏的修复

[复制链接]

70

主题

11

回帖

286

积分

管理员

积分
286
发表于 2025-2-5 20:02:12 | 显示全部楼层 |阅读模式
Android Handler很容易造成内存泄漏,平时工作时也经常遇到。常见的处理方法如下:
使用弱引用(WeakReference):
创建一个弱引用到你的Activity或Fragment,这样即使Handler还在运行,也不会导致内存泄漏。
[color=var(--hltools-color)][size=1.15em]JAVA


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.lang.ref.WeakReference;

public class MyHandler extends Handler {
    private final WeakReference<ActivityOrFragment> mActivityOrFragment;

    public MyHandler(ActivityOrFragment activityOrFragment) {
        mActivityOrFragment = new WeakReference<>(activityOrFragment);
    }

    @Override
    public void handleMessage(Message msg) {
        ActivityOrFragment activity = mActivityOrFragment.get();
        if (activity != null) {
            // 更新UI
        }
    }
}
在Activity或Fragment销毁时移除消息队列:
确保当Activity或Fragment销毁时,所有的Handler消息都被移除,以防止Handler尝试执行任何操作。
[color=var(--hltools-color)][size=1.15em]JAVA


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
protected void onDestroy() {
    super.onDestroy();
    mHandler.removeCallbacksAndMessages(null);
}
使用HandlerThread:

如果你正在使用后台线程与Handler通信,可以使用HandlerThread,它是一个具有Looper的Thread,可以用来处理后台操作,并且在Activity或Fragment销毁时调用handlerThread.quit()来结束线程。

HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());

@Override
protected void onDestroy() {
    super.onDestroy();
    handlerThread.quit();
}

0

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2025-3-3 15:53:00 | 显示全部楼层
当Message的消息处理后,对应的Handler就会释放,所以这不是问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|软件开发

GMT+8, 2025-8-27 07:08 , Processed in 0.124300 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表