1. 内存泄漏(Memory Leak)
场景与原因:
静态变量持有Context:静态对象(如单例)长期持有Activity引用,导致Activity无法回收。
匿名内部类:Handler、Runnable等内部类隐式持有外部类(如Activity)的引用。
未释放监听器或广播:注册的广播接收器(BroadcastReceiver)或事件监听未在组件销毁时注销。
资源未关闭:文件流、数据库连接未及时关闭。
优化策略与实现:
弱引用替代强引用:使用
WeakReference
或WeakHandler
避免对象被长期持有。private static class SafeHandler extends Handler { private WeakReference<Activity> activityRef; SafeHandler(Activity activity) { activityRef = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { Activity activity = activityRef.get(); if (activity == null) return; // 处理消息 } }
生命周期管理:在
onDestroy()
中注销监听器和广播,释放资源(如关闭数据库连接)。静态内部类:将Handler等组件定义为静态内部类,并通过弱引用持有外部类。
工具检测:集成LeakCanary自动检测内存泄漏,或使用Android Prof