Android 内存泄漏避坑

1. 匿名内部类 / 非静态内部类持有外部类引用

js 复制代码
void testHttpRequest(Activity activity) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(10000); // 模拟耗时操作
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

问题:

匿名 Runnable 默认持有 activity 的引用,如果这段代码在 Activity 销毁后还在运行,就会导致 Activity 无法被 GC。

解决方式:

使用弱引用:

js 复制代码
void testHttpRequest(WeakReference<Activity> weakReference) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Activity activity = weakReference.get();
            if (activity != null) {
                // 安全使用 activity
            }
        }
    }).start();
}

2. Handler 导致的泄漏

js 复制代码
public class MyActivity extends Activity {
    Handler handler = new Handler();

    void startTask() {
        handler.postDelayed(() -> {
            // 执行某些操作
        }, 10000);
    }
}

问题:

非静态 Handler 自动持有 Activity 的引用,导致泄漏。

解决方式

js 复制代码
@Override
protected void onDestroy() {
    handler.removeCallbacksAndMessages(null); // 清空队列
    super.onDestroy();
}

手动清空消息队列

总结

当异步任务或延迟执行的代码中隐式或显式地引用了 Activity,而这些任务的生命周期超过了 Activity 本身,就可能导致 Activity 无法被 GC 回收,形成内存泄漏。

3. 单例或静态变量持有 Context

js 复制代码
public class AppManager {
    private static Context context;

    public static void init(Context ctx) {
        context = ctx;
    }
}

问题:

如果传入的是 ActivityView,会因持久持有导致内存泄漏。

解决方式:

只保存 ApplicationContext

相关推荐
pengyu15 小时前
【Kotlin 协程修仙录 · 炼虚境 · 初阶】 | 虚空造物:Channel 基础与协程间通信的管道艺术
android·前端·kotlin
小强闯江湖15 小时前
ViewCompose:让原生 Android View 进入声明式时代
android·开源·kotlin
摇滚侠17 小时前
《SpringBoot 3:入门与应用实战》第 6 章 Spring Boot 最佳实践 阅读笔记 12
android·spring boot·笔记
mmsx18 小时前
Android 宠物健康服务平台实战:从架构设计到主题换肤完整解析(源码和文档)
android·架构·sqlite·app·源码·宠物
、如果18 小时前
ima Skills 自进化实战:三层结构、反馈与版本验证
android·人工智能·ai编程
hunterandroid18 小时前
自定义 View 绘制与触摸冲突:从滑动卡顿到事件分发闭环
android·前端
weixin_4038101318 小时前
安卓自动化脚本 HID 硬件选购指南:蓝牙HID与OTG HID区别、成本与搭建教程
android·运维·自动化·hid·安卓自动化脚本·安卓中控
qq_3168377519 小时前
uniapp 安卓/H5 使用 contentEditable 属性 富文本编辑器
android·javascript·uni-app
二流小码农19 小时前
鸿蒙开发:了解Context
android·ios·harmonyos
404_coder19 小时前
源码视角下的 Android 开机流程(三):从 Launcher Task 到 WindowState 挂载
android