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

相关推荐
lynn8570_blog9 分钟前
关于compose的remember
android·kotlin
毕设源码-邱学长20 分钟前
【开题答辩全过程】以 基于安卓的外卖点餐APP的设计与实现为例,包含答辩的问题和答案
android
csj5038 分钟前
安卓基础之《(16)—内容提供者(2)使用内容组件获取通讯信息》
android
·云扬·1 小时前
ClickHouse常用管理语句汇总:会话、磁盘、性能与复制管理
android·clickhouse
游戏开发爱好者81 小时前
2025年iOS应用上架App Store全指南,开发者必看
android·ios·小程序·https·uni-app·iphone·webview
a3158238061 小时前
Android CardView修改背景阴影
android·cardview·修改背景
kk哥88992 小时前
Android UI 优化指南:流畅度与体验双提升
android·ui
摘星编程3 小时前
Flutter for OpenHarmony 实战:SliverList 滑动列表详解
android·javascript·flutter
abbiz3 小时前
30 个 Android 面试高频问题及答案
android·面试·职场和发展
冬奇Lab3 小时前
【Kotlin系列04】类与对象基础:从Java Bean到Data Class的优雅蜕变
android·kotlin·编程语言