删除Firebase侦听器无法运行Android

时间:2018-01-15 12:28:39

标签: android firebase firebase-realtime-database kotlin

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

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 个答案:

答案 0 :(得分:2)

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不是很满意,但是请原谅语法问题,但上面的代码应该有效。

答案 1 :(得分:1)

要删除侦听器,首先需要创建它,然后将其附加到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

相关问题