0

我有一个Fragment里面Activity我正在使用一个名为的库ExoMedia,你可以在 github 上查看它它是 google 的ExoPlayer.

在这个片段中,我声明了两个字段:

private EMVideoView emVideoView;
private VideoControlsMobile controlsMobile;

后来我实例化它们:

    private void setupVideoView() {
    controlsMobile = new VideoControlsMobile(getActivity());
    controlsMobile.setOnFullScreenListener(this);

    emVideoView.setVideoURI(Uri.parse(videoUrl));
    emVideoView.setControls(controlsMobile);
    emVideoView.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion() {
            isCompleted = true;
            emVideoView.setVideoURI(Uri.parse(videoUrl));
            if (hasPolls || ((BaseActivity) getActivity()).hasPolls) {
                if ((((BaseActivity) getActivity()).isUserSignedIn())) {
                    displayVotingDialog();
                }
            }
        }
    });

}

在哪里onDestroy我试图让它们都为空,这样它们Context在泄漏 Activity 时就不会泄漏任何东西:

@Override
public void onDestroy() {
    super.onDestroy();
    if (controlsMobile != null) {
        controlsMobile.setOnFullScreenListener(null);
        controlsMobile = null;
    }
    if (emVideoView != null) {
        emVideoView.setControls(null);
        emVideoView.setOnPreparedListener(null);
    }
}

但是当我退出时,我仍然Activity收到了LeakCanary泄漏的报告Context

* com.oneproject.main.projects.ProjectsActivity has leaked:
* GC ROOT android.os.MessageQueue.mMessages
* references android.os.Message.next
* references android.os.Message.next
* references android.os.Message.callback
* references com.devbrackets.android.exomedia.util.Repeater$PollRunnable.this$0
* references com.devbrackets.android.exomedia.util.Repeater.listener
* references com.devbrackets.android.exomedia.ui.widget.VideoControls$6.this$0 (anonymous implementation of com.devbrackets.android.exomedia.util.Repeater$RepeatListener)
* references com.devbrackets.android.exomedia.ui.widget.VideoControlsMobile.activity
* leaks com.oneproject.main.projects.ProjectsActivity instance

所以我有两个问题:

a) 我做的不onDestroy()正确:将 VideoControls 对象设置为 null,这样它就不会保持活动状态并泄漏内存。

b)这是一个错误还是我忘记发布某些内容并导致我出现此错误?

谢谢

4

1 回答 1

1

我认为该库存在内存泄漏... VideoControls 正在创建一个匿名的 RepeatListener 但从未将其归零https://github.com/brianwernick/ExoMedia/blob/11b28992d4f819902b63949fe2cf54720edb172f/library/src/main/java/com/devbrackets/ android/exomedia/ui/widget/VideoControls.java#L621

该侦听器在您的活动创建和销毁之后被保留。理想情况下,图书馆会让你取消那个听众。

这是保留发生的地方https://github.com/brianwernick/ExoMedia/blob/5dc963c8f49aa9e6bef318118e97e859b22979a4/library/src/main/java/com/devbrackets/android/exomedia/util/Repeater.java#L96

于 2016-09-06T17:07:27.740 回答