在Android中,当一个Activity被销毁时,我应该删除所有的侦听器
ref.addAuthStateListener(listener);
ref.addListenerForSingleValueEvent(listener);
ref.addChildEventListener(listener);
ref.addValueEventListener(listener);
使用ref.removeEventListener(listener)
还是会自动销毁?
我知道对于FirebaseRecyclerAdapter
我们可以使用cleanup()
来完成这项工作。
除了监听器和适配器之外还有其他需要清理的对象吗?
答案 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侦听器,则仍然必须手动将其删除。