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 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧5 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker9 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋10 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧1 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin