使用Firebase时防止内存泄漏的最佳方法

5
在Android中,当一个Activity被销毁时,我应该移除所有的监听器吗?
ref.addAuthStateListener(listener);
ref.addListenerForSingleValueEvent(listener);
ref.addChildEventListener(listener);
ref.addValueEventListener(listener);

使用 ref.removeEventListener(listener) 是手动清理监听器的方法,如果不手动清理,它们也会被自动销毁吗?

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

2个回答

7
Firebase监听器不会自动删除。您确实需要通过调用removeEventListener()来删除它们,就像添加它们一样。
是否在onDestroy()中删除监听器取决于您添加它们的位置。我通常在与我添加它们相反的事件中删除它们。因此,如果我在onCreate()中添加它们,我会在onDestroy()中删除它们(或调用cleanup())。对于onStart()/onStop()onPause()/onResume()同样适用。

addListenerForSingleValueEvent怎么样? - Aizen
3
一旦触发,这会自动删除。如果没有被触发(例如您离线),您仍应该将其删除。对我来说,这是不使用它们的另一个原因。 :-) - Frank van Puffelen
@FrankvanPuffelen,您是在暗示使用addListenerForSingleValueEvent不是一个好的做法吗?正如您所说,当我离线时它会引起一些麻烦。 - Nishanth Sreedhara
如果可能的话,请使用Firebase REST API:https://firebase.google.com/docs/reference/rest/database/ - Pedro Madrid

0

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

您可以在 这里 检查代码。您可能不需要手动添加 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侦听器,则仍然必须手动删除它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接