移除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) } 

2 Solutions collect form web for “移除Firebase侦听器不适用于Android”

为了移除侦听器,首先需要创建它,然后将其附加到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不是很舒服,所以请原谅,但上面的代码应该工作。

  • 在Kotlin中有一个简单的方法来获得_id的对象吗?
  • Kotlin类实例声明不正确
  • Kotlin:使Java函数可调用中缀
  • Mutidex和Kotlin
  • OpenCV:在Android上,将Kotlin中的Mat与Scalar相乘
  • 如何find哪个元素在Kotlin中的数组比较失败?
  • 如何编写委托给另一个属性的委托?
  • 为什么Kotlin编译器需要var属性的显式初始化器?
  • HashMap错误 - containsKey,get
  • 在库模块中使用Kotlin,而不在app模块中使用它
  • 使用特定字符串从集合中过滤数据
  • Kotlin language will be the best programming language for Android.