Firebase实时数据库单值侦听器多次触发

2024-03-22

我正在尝试从其他值侦听器中的数据库接收数据。

类 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正在调用方法doMyJob每一次多一次reference触发而不是每次更改仅运行一次。首先读自reference可以,但是第二次打电话doMyJob2次,第三次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:抱歉代码丑陋。我试图尽可能地简化问题。


你正在使用一个singleEventListener在第二个查询中,但在第一个查询中,您仍在使用不会自动消失的普通事件侦听器。所以这可能就是您的代码被多次调用的原因。所以问题不在于你单个事件监听器被多次调用,但上面的那个可能是每次创建一个新的单个事件监听器这又会多次调用您的方法。

reference.addValueEventListener(object : EventListener() { //ordinary event listener will be kept running 
        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)
                    }
            })
        }
    })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase实时数据库单值侦听器多次触发 的相关文章

随机推荐