【问题标题】:Best way to prevent memory-leak when using Firebase使用 Firebase 时防止内存泄漏的最佳方法
【发布时间】:2016-04-01 18:28:15
【问题描述】:

在Android中,当一个Activity被销毁时,我应该删除所有的监听器

ref.addAuthStateListener(listener);
ref.addListenerForSingleValueEvent(listener);
ref.addChildEventListener(listener);
ref.addValueEventListener(listener);

使用ref.removeEventListener(listener),否则它们会被自动销毁?

我知道对于FirebaseRecyclerAdapter,我们可以使用cleanup() 来完成这项工作。 除了侦听器和适配器,我们还需要清理其他对象吗?

【问题讨论】:

    标签: android memory-leaks firebase


    【解决方案1】:

    Firebase 侦听器不会自动移除。您确实必须通过调用removeEventListener() 来删除它们,就像您添加它们一样。

    您是否删除onDestroy() 中的侦听器实际上取决于您添加它们的位置。如果与添加它们的位置相反,我通常会删除它们。因此,如果我在 onCreate() 中添加 then,我将在 then 中删除(或在 onDestroy() 中调用 cleanup()onStart()/onStop()onPause()/onResume() 类似。

    【讨论】:

    • addListenerForSingleValueEvent 怎么样?
    • 它会被自动删除一旦触发。如果它没有被触发(即如果你离线),你仍然应该删除它。就我而言,另一个不使用它们的理由。 :-)
    • @FrankvanPuffelen 您是否建议使用 addListenerForSingleValueEvent 不是一个好习惯?就像你说的,我离线的时候给我带来了一些麻烦。
    • 如果可能,请改用 Firebase REST API:firebase.google.com/docs/reference/rest/database
    【解决方案2】:

    我遇到了同样的问题,导致大量内存泄漏。因此,我创建了一个新类来处理添加的侦听器,并在调用相应的方法(onPause()、onStop() 或 onDestroy())时将其删除。使用androidx.lifecycle 库,适用于活动和片段(实际上,任何实现LifecycleOwner 的类)。

    您可以查看代码here。不手动添加 androidx.lifecycle 依赖项可能会很好,但您也可以将其添加到模块级 build.gradle:

    implementation 'androidx.lifecycle:lifecycle-runtime:VERSION'
    

    在您当前的代码中,而不是:

    databaseReference.addValueEventListener(valueEventListener);
    // or
    databaseReference.addListenerForSingleValueEvent(valueEventListener);
    

    你需要使用:

    addValueEventListener(databaseReference, valueEventListener); 
    // or
    addListenerForSingleValueEvent(databaseReference, valueEventListener);
    

    这在从使用 FirebaseListenerHandler 的活动或片段中调用时有效,如gist 所示。如果您需要在其他情况下(如服务)添加 Firebase 侦听器,您仍然需要手动移除它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2021-10-22
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多