videoview的SubtitleController.Anchor内存泄漏问题

2,004 阅读1分钟

最近在做优化的时候,发现一个奇怪的泄漏,videoview中的mAnchor泄漏,奇怪的是,我代码中并没有去初始化这个东西,为什么会导致泄漏?顺着源码找到下面这个东西:

这里在openvideo的时候,初始化了这个SubtitleController,但是在视频结束的时候又没有做相对应的释放
因此导致了泄漏,这个看起来是系统的bug,那如何解决这个问题?

1、不在xml中定义videoview,改为在代码中初始化

val video = VideoView(AppApplication.instance)
rootView.addView(video)

然后在不使用的时候释放掉

video.stopPlayBack()
rootView.RemoveAllViews()

这样就不会泄漏了,但是这样总感觉很不爽,有没有其他的替换方式?答案是有的,在上面的代码中,我们在初始化videoview的是传入application的context,那我们可以修改activity的context来达到这个目的。请看下面第二种方式

2、由于videoview内部是用mediaplayer+surfaceview实现的,因此问题点就在于mediaplayer没有及时的释放资源导致的泄漏,那我们可以这么做,重写activity的这个方法,替换内部的systemservice实现,来完成我们的泄漏处理

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(new ContextWrapper(newBase){
            @Override
            public Object getSystemService(String name) {
                return BaseApplication.getInstance().getSystemService(name);
            }
        });
    }

通过上面两种方式的处理,应该就不会泄漏。