尽管我在离开时正在释放资源,但泄漏了上下文 activity
Leaking context although I'm releasing resources when leaving activity
我在 Activity
中有一个 Fragment
,我在其中使用名为 ExoMedia
的库,您可以在 github 上检查它 here 及其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
的位置,我试图让它们都为空,这样当泄漏 Activity 时它们不会泄漏任何 Context
:
@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[=14=]
* references com.devbrackets.android.exomedia.util.Repeater.listener
* references com.devbrackets.android.exomedia.ui.widget.VideoControls.this[=14=] (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 对象设置为空,这样它就不会保持活动状态并泄漏内存。
b) 这是一个错误还是我忘记发布某些东西导致我出现这个错误?
谢谢
我认为该库存在内存泄漏...VideoControls 正在创建一个匿名的 RepeatListener,但从未将其清零 https://github.com/brianwernick/ExoMedia/blob/11b28992d4f819902b63949fe2cf54720edb172f/library/src/main/java/com/devbrackets/android/exomedia/ui/widget/VideoControls.java#L621。
该听众在您 activity 创建和销毁之后保留下来。理想情况下,图书馆会让你取消那个听众。
我在 Activity
中有一个 Fragment
,我在其中使用名为 ExoMedia
的库,您可以在 github 上检查它 here 及其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
的位置,我试图让它们都为空,这样当泄漏 Activity 时它们不会泄漏任何 Context
:
@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[=14=]
* references com.devbrackets.android.exomedia.util.Repeater.listener
* references com.devbrackets.android.exomedia.ui.widget.VideoControls.this[=14=] (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 对象设置为空,这样它就不会保持活动状态并泄漏内存。
b) 这是一个错误还是我忘记发布某些东西导致我出现这个错误?
谢谢
我认为该库存在内存泄漏...VideoControls 正在创建一个匿名的 RepeatListener,但从未将其清零 https://github.com/brianwernick/ExoMedia/blob/11b28992d4f819902b63949fe2cf54720edb172f/library/src/main/java/com/devbrackets/android/exomedia/ui/widget/VideoControls.java#L621。
该听众在您 activity 创建和销毁之后保留下来。理想情况下,图书馆会让你取消那个听众。