在开发PlayergsyVideoPlayer 的时候,我们重写了OrientationEventListener 。但是使用leakCanary检测还是发现有内存泄漏
泄漏日志为持有上层activity。
场景代码:
public static class MyOrientationEventListener extends OrientationEventListener {
WeakReference softReference;
Activity innerActivity;
private GSYBaseVideo PlayergsyVideoPlayer;
public MyOrientationEventListener(Context context, OrientationRewriteUtils orientationRewriteUtils) {
super(context);
softReference =new WeakReference<>(orientationRewriteUtils);
innerActivity =softReference.get().mActivity;
gsyVideoPlayer =softReference.get().gsyVideoPlayer;
}
问题浮现:已经改成这种静态外部类形式了,为什么还会有内存泄漏?
通过leakCannary 泄漏的地方在innerActivity
正确的写法是:
public static class MyOrientationEventListenerextends OrientationEventListener {
WeakReferencesoftReference;
public MyOrientationEventListener(Context context, OrientationRewriteUtils orientationRewriteUtils) {
super(context);
softReference =new WeakReference<>(orientationRewriteUtils);
}
接下来在类的内部:
在用到innerActivity的地方:用softReference.get().mActivity 替代;
在用到PlayergsyVideoPlayer的地方:用softReference.get().gsyVideoPlayer 替代;
构造方法里不能出现非弱引用的对象的实例化。
实测后,泄漏消失。
Android内存泄漏解决(总)
网友评论