在Firebase

时间:2017-07-11 06:55:47

标签: android firebase memory-leaks firebase-realtime-database

最近,我在使用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);
}

最后这里是泄漏金丝雀的截图。

enter image description here

PS:我没有在任何Activity / Fragments中使用任何匿名的ValueEventListeners。然而,每个Activity和Fragment都会泄漏内存,并在LeakCanary中提供以下信息

enter image description here

顺便说一句。 我仍在使用Firebase库版本10.2.6

有人可以帮我识别,出了什么问题吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您需要根据活动生命周期以onPause()onStop()方法删除侦听器。您需要记住,并不总是调用onDestroy()方法。

希望它有所帮助。