【问题标题】:Experiencing Memory leak due to Anonymous Implementation of ValueEventListener in Firebase由于 Firebase 中 ValueEventListener 的匿名实现而导致内存泄漏
【发布时间】:2017-07-11 06:55:46
【问题描述】:

最近,我在使用 Firebase ValueEventListeners 的每个 Fragment 和 Activity 中都遇到了内存泄漏。我不确定为什么会这样。一切都很好,直到我尝试清理我的代码(比如重命名我的片段、活动、将所有模型类移动到一个单独的包)。除了内存泄漏,一切都运行良好。

过去几个小时我一直试图找出问题所在,但徒劳无功。这就是我在每个 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/Fragment 中使用任何匿名 ValueEventListeners。然而,每个 Activity 和 Fragment 都会在 LeakCanary 中使用以下信息泄漏内存

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

谁能帮我确定,出了什么问题?

谢谢。

【问题讨论】:

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


【解决方案1】:

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

希望对你有帮助。

【讨论】:

  • Alex 是对的,设置监听器的最佳方式是在 onStart 方法中,并在 onStop 方法中移除。
  • 由于我在活动中使用onFinish() in onBackPressed,我假设onDestroy() 将被调用。但是您可能对 Fragment 中的 onDestroy() 是正确的(在我的情况下)。我将在 Fragment 和 Activity 中尝试一下,然后回复您。
  • 我在 onClickListener 中有一个 ValueEventListener。我应该在哪里删除监听器(我的意思是在onStop()onDestroy())?
  • 如果你在onStarted()方法中添加了监听器,那么你必须在onStoped()中删除它,如果你在onResumed()方法中添加了监听器,那么你必须在`onPaused中删除它()'。这就是它的工作原理。
  • 我能理解。现在,我已将所有 Firebase 侦听器移至 onStart(),但保留在方法中的一个 Firebase 侦听器除外。此方法在单击菜单按钮时执行。我还将删除 onStop() 中的所有 Firebase 侦听器。然而,由于 Firebase 监听器,我仍然收到内存泄漏。因此我的上述问题。
猜你喜欢
  • 2017-01-06
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2020-02-09
  • 2016-07-10
相关资源
最近更新 更多