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

相关推荐
程序员陆业聪3 小时前
两次Flutter全屏白踩坑复盘:Layout的静默失败,以及AI结对编程的认知盲区
android
程序员陆业聪5 小时前
Compose Strong Skipping Mode 的真相:它并不会让你的类型变 Stable
android
shaoming37769 小时前
浏览器动作开发:地址栏图标点击事件、弹出页面设计
android·mysql·adb
赏金术士9 小时前
Kotlin 协程与挂起函数(Coroutines & suspend)入门到实战
android·开发语言·kotlin
泡泡以安12 小时前
Unidbg学习笔记(十三):固定随机干扰项
android·逆向
泡泡以安12 小时前
Unidbg学习笔记(十六):Console Debugger
android·逆向
赏金术士12 小时前
Room + Flow 完整教程(现代 Android 官方方案)
android·kotlin·room·compose
泡泡以安12 小时前
Unidbg学习笔记(八):文件系统层补环境
android·逆向
泡泡以安12 小时前
Unidbg学习笔记(六):补环境的思维框架
android·逆向
通往曙光的路上12 小时前
mysql2
android·adb