我正在向引用添加一个事件值侦听器,当我想删除它时,但它不起作用。
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)
}
答案 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
。