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

相关推荐
Gracker1 小时前
Android Perfetto 系列 9 - CPU 信息解读
android
Gracker1 小时前
Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析
android
Gracker2 小时前
Android Perfetto 系列 07 - MainThread 和 RenderThread 解读
android
Gracker2 小时前
Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程
android
Gracker2 小时前
Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战
android
apigfly2 小时前
Flutter,Compose,Web 在Android平台上从布局到屏幕的机制探究
android·flutter·webview
czhc11400756634 小时前
Java1112 基类 c#vscode使用 程序结构
android·java·数据库
從南走到北5 小时前
JAVA国际版打车APP打车顺风车滴滴车跑腿APP源码Android+IOS+H5
android·java·ios
独自破碎E5 小时前
从括号匹配到字符串解码:递归思想的巧妙应用
android·java·开发语言
只想搞钱的肥仔5 小时前
Android thermal (7)_thermal core
android