【发布时间】:2018-08-02 15:37:13
【问题描述】:
我正在尝试从其他值侦听器中的数据库接收数据。
类 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:抱歉代码很丑。我试图尽可能地简化问题。
【问题讨论】:
-
doingMyJob到底是做什么的? -
@DougStevenson 它显示了对话框,但我认为这没有任何意义。
-
也许您可以更新您的问题以准确解释您在此处尝试完成的工作,以及代码中的一些日志行,以及帮助我们了解实际情况的日志输出.
-
@Doug Stevenson 我添加了数据库结构
标签: android firebase firebase-realtime-database kotlin