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

时间:2016-04-01 18:28:15

标签: android memory-leaks firebase

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

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

使用ref.removeEventListener(listener)还是会自动销毁?

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

我遇到了同样的问题,并且导致很多内存泄漏。因此,我创建了一个新类来处理添加的侦听器,并在调用相应的方法(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侦听器,则仍然必须手动将其删除。