移除Firebase侦听器不适用于Android

我将一个事件值侦听器添加到引用,当我想删除它,但它不起作用。

override fun onStart() { super.onStart() stateListener =dbReference.stateRef.addValueEventListener(object : ValueEventListener { override fun onCancelled(p0: DatabaseError?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onDataChange(snapshot: DataSnapshot?) { //there is my functions }) } override fun onStop() { super.onStop() dbReference.stateRef.removeEventListener(stateListener) Log.d("My_TAG", "$stateListener ") } 

这是我添加活动的唯一地方。

编辑后(仍然不工作)

 override fun onStart() { super.onStart() stateListener = object : ValueEventListener { override fun onCancelled(p0: DatabaseError?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } //One of the phone got flipped override fun onDataChange(snapshot: DataSnapshot?) { } } dbReference.stateRef.addValueEventListener(stateListener) } override fun onStop() { super.onStop() Log.d("Life", "onStop") dbReference.stateRef.removeEventListener(stateListener) } 

为了移除侦听器,首先需要创建它,然后将其附加到DatabaseReference对象。

 val valueEventListener = ValueEventListener() { //override fun onDataChange //override fun onCancelled } dbReference.stateRef.addValueEventListener(eventListener) 

所以要删除这个监听器,你需要按照你的活动的生命周期来做:

 dbReference.stateRef.removeEventListener(valueEventListener); 
  • 如果您在onStart添加了监听器,则必须在onStop中将其删除。
  • 如果在onResume添加了监听器,则必须在onPause中将其删除。
  • 如果你已经在onCreate添加了监听器,你必须在onDestroy移除它。

但请记住,并不总是调用onDestroy

addValueEventListener不返回任何东西。 您只是匿名创建了侦听器。 因此,您的stateListener不是指您的侦听器。

改变你的代码如下:

 class YourClassName:Activity(){ private lateinit var statelistener: ValueEventListener override fun onStart() { stateListener = ValueEventListener { [...] } dbReference.stateRef.addValueEventListener(stateListener) } override fun onStop() { super.onStop() dbReference.stateRef.removeEventListener(stateListener) Log.d("My_TAG", "$stateListener ") } } 

现在,您的取消订阅代码应该工作。 我对Kotlin不是很舒服,所以请原谅,但上面的代码应该工作。