Firebase Realtime数据库单值侦听器多次触发 [英] Firebase Realtime database single value listener triggering many times
问题描述
我正在尝试从其他值侦听器中的数据库接收数据.
MyFragment类:Fragment(){
private lateinit var reference: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
reference = FirebaseDatabase.getInstance().reference.child("FIRST_ROOT")
.child("FIRST_CHILD")
.child("CHILD_1")
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
reference.addValueEventListener(object : EventListener() {
override fun onDataChange(p0: DataSnapshot?) {
val childOfSecondRoot= p0?.value
FirebaseDatabase.getInstance().reference.child("SECOND_ROOT")
.child(childOfSecondRoot).addListenerForSingleValueEvent(object : EventListener() {
override fun onDataChange(p0: DataSnapshot?) {
doingMyJob(p0?.value)
}
})
}
})
}
我的目标是对参考值中的每个观察值更改一次运行方法doingMyJob
.
由于某些原因,添加为addListenerForSingleValueEvent
的事件侦听器在每次reference
触发器时都调用一次方法doMyJob
一次,而不是每次更改仅运行一次.第一次从reference
读取是可以的,但是第二次调用doMyJob
2次,第三次3次,依此类推.重新启动后,应用程序历史记录从头开始.方法doMyJob()
不更改数据库中的任何值.
目前,我知道对于观察值的每一个更改,父侦听器都称为增量侦听器.
数据库结构:
|MAIN_ROOT
|\FIRST_ROOT
| \FIRST_CHILD
| |DATA_TO_RECEIVED //reference field - parent listener for many events
|\SECOND_ROOT
| \DATA_TO_RECEIVED // root name received in nested listener-as single value
| |CHILD_1
| |CHILD_2
| |CHILD_3
我做错什么了吗?是否有可能从侦听器运行侦听器,从而避免嵌套侦听器的增量调用?
PS:对不起,代码不好.我正在尝试尽可能简单地解决问题.
有趣的事情.显示对话框启动新片段后的方法doMyJob
(很抱歉在我的问题中遗漏了它),在我关闭它之后,重新启动了在onActivityCreated中添加侦听器的片段,因此...再次分配了val reference
并添加了另一个侦听器. /p>
我只是喜欢这种错误.谢谢大家的帮助.
I'm trying to receive data from database in other value listener.
class MyFragment : Fragment() {
private lateinit var reference: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
reference = FirebaseDatabase.getInstance().reference.child("FIRST_ROOT")
.child("FIRST_CHILD")
.child("CHILD_1")
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
reference.addValueEventListener(object : EventListener() {
override fun onDataChange(p0: DataSnapshot?) {
val childOfSecondRoot= p0?.value
FirebaseDatabase.getInstance().reference.child("SECOND_ROOT")
.child(childOfSecondRoot).addListenerForSingleValueEvent(object : EventListener() {
override fun onDataChange(p0: DataSnapshot?) {
doingMyJob(p0?.value)
}
})
}
})
}
My goal is to run method doingMyJob
once per change in observed value in reference.
For some reason event listener added as addListenerForSingleValueEvent
is calling method doMyJob
one more time for each time reference
trigger instead of run it only once per change. First read from reference
is OK, but second call doMyJob
2 times, third 3 times and so on. After restart app history starts from beginning. Method doMyJob()
don't change any values in database.
For now I know that parent listener is called incrementaly for each single change in observed value.
Database structure:
|MAIN_ROOT
|\FIRST_ROOT
| \FIRST_CHILD
| |DATA_TO_RECEIVED //reference field - parent listener for many events
|\SECOND_ROOT
| \DATA_TO_RECEIVED // root name received in nested listener-as single value
| |CHILD_1
| |CHILD_2
| |CHILD_3
Am I doing something wrong? Is there a possibility to run listener from listener avoiding incremental call of nested listener?
PS: Sorry for ugly code. I was trying to simplyfy problem as much as it was possible.
Funny thing. Method doMyJob
after show dialog launch new fragment (sorry for missed it in my question) and after I close it fragment which add listener in onActivityCreated is relaunched so... val reference
is assigned again and another listerer is added.
I just love this kind of bugs. Thanks everybody for help.
这篇关于Firebase Realtime数据库单值侦听器多次触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!