Firebase Realtime数据库单值侦听器多次触发 [英] Firebase Realtime database single value listener triggering many times

查看:69
本文介绍了Firebase Realtime数据库单值侦听器多次触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆