最近,我在使用Firebase ValueEventListeners的每个Fragment和Activity中遇到内存泄漏。我不确定为什么会这样。一切都很好,直到我尝试清理我的代码(比如重命名我的碎片,活动,将所有模型类移动到一个单独的包)。除了内存泄漏,一切正常。
过去几个小时我一直试图找到这个问题但是徒劳无功。这就是我在Every Fragment和Activity中使用ValueEventListeners的方法。
private ValueEventListener articleListener;
在onCreate()中,我创建了一个返回ValueEventListener
private ValueEventListener articleListener() {
articleListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ModelImage model = dataSnapshot.getValue(ModelImage.class);
ImageCoverImageUrl = model.getImageCoverImageUrl();
ImageTitle = model.getImageTitle();
}
@Override
public void onCancelled(DatabaseError databaseError) {/*Do Nothing*/}
};
return articleListener;
}
现在定义数据库参考。
dbArticle = dbRoot
.child(getResources().getString(R.string.Child_Articles))
.child(ArticleLanguage)
然后是这行代码
dbArticle.addValueEventListener(articleListener());
最后在onDestroy()中,
if (dbArticle != null && articleListener != null) {
dbArticle.removeEventListener(articleListener);
}
最后这里是泄漏金丝雀的截图。
PS:我没有在任何Activity / Fragments中使用任何匿名的ValueEventListeners。然而,每个Activity和Fragment都会泄漏内存,并在LeakCanary中提供以下信息
顺便说一句。 我仍在使用Firebase库版本10.2.6
有人可以帮我识别,出了什么问题吗?
感谢。
答案 0 :(得分:1)
您需要根据活动生命周期以onPause()
或onStop()
方法删除侦听器。您需要记住,并不总是调用onDestroy()
方法。
希望它有所帮助。