android内存泄漏快速解决——案例

在开发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内存泄漏解决(总)

你可能感兴趣的:(android内存泄漏快速解决——案例)