【问题标题】:Firebase onChildChanged() get called 3 times though I changed a value twiceFirebase onChildChanged() 被调用了 3 次,尽管我更改了两次值
【发布时间】:2019-10-06 10:17:22
【问题描述】:

不是每次,但有时(我觉得是 10%)onChildChanged() 方法会被调用 3 次,尽管我实际上更改了两次。

这里是日志。

这是我两次更改值时的日志。 (真→假→真,※原值为真)

05-20 12:39:14.948 3960-3960/com.yoji0806.wastekiller1 I/childChanged: check: false, tablet: 1
05-20 12:39:14.948 3960-3960/com.yoji0806.wastekiller1 I/childChanged: check: true, tablet: 1
05-20 12:39:16.276 3960-3960/com.yoji0806.wastekiller1 I/printReceipt: table: TN 18

这是 onChildChanged() 被调用 3 次时的日志,尽管我只更改了两次值。 (真→假→真,※原值为真)

05-20 12:39:40.818 3960-3960/com.yoji0806.wastekiller1 I/childChanged: check: true, tablet: 1
05-20 12:39:40.820 3960-3960/com.yoji0806.wastekiller1 I/childChanged: check: false, tablet: 1
05-20 12:39:40.822 3960-3960/com.yoji0806.wastekiller1 I/childChanged: check: true, tablet: 1
05-20 12:39:41.670 3960-3960/com.yoji0806.wastekiller1 I/printReceipt:table: TN 18      
05-20 12:39:46.376 3960-3960/com.yoji0806.wastekiller1 I/printReceiot:table: TN 18

我不知道上面第一行日志发生了什么。虽然原始值为真,但它捕捉到了从“真”到“真”的变化。

这是我的代码。

private val listener = object : ChildEventListener{
    override fun onChildRemoved(p0: DataSnapshot) {}
    override fun onChildMoved(p0: DataSnapshot, p1: String?) {}
    override fun onCancelled(p0: DatabaseError) {}

    override fun onChildAdded(p0: DataSnapshot, p1: String?){

        val check: Boolean = p0.child("check").value.toString().toBoolean()
        val tablet = p0.child("tablet").value.toString()


        Log.i("childAdded:" , "check: $check, tablet: $tablet")


        if (check){
            val tableNum = p0.key.toString()
            readData(tableNum, tablet)
        }
    }

    override fun onChildChanged(p0: DataSnapshot, p1: String?) {

        val check: Boolean = p0.child("check").value.toString().toBoolean()
        val tablet = p0.child("tablet").value.toString()


        Log.i("childChanged:", "check: $check, tablet: $tablet")


        if (check){
            val tableNum = p0.key.toString()
            readData(tableNum, tablet)
        }
    }
}

 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_receive)

    val mDatabase = FirebaseDatabase.getInstance()

    mDatabase.getReference("Checker").addChildEventListener(listener)
  }

添加

·在我获取上面这两个日志之前,我已经附加了监听器,并且日志时间戳显示我在获取第一个日志后不久就获取了第二个日志。在两次行动之间(采取了 2 个日志)我没有采取任何行动。

・我使用两种类型的平板电脑。一种用于写入 DB,另一种用于侦听 DB 上的更改。问题出现在 2 型平板电脑中。

【问题讨论】:

    标签: android database firebase firebase-realtime-database kotlin


    【解决方案1】:

    这是微不足道的。 任何状态改变监听器都会被调用

    更改的次数 + 第一次连接监听器

    .

    这意味着,当您附加它时,您第一次调用了您的孩子更改的侦听器。 然后在您第二次进行更改时调用它。 然后第三次你做了最后一次改变。 总计 = 3。

    【讨论】:

    • 在上面取两个Log之前,我已经附上了监听器。正如这些日志时间所示,我在获得第一个日志后不久就获得了第二个日志。
    • 第一个实例在你附加监听器的那一刻被调用
    • 我编辑了我的代码。我认为我附加监听器的那一刻是 onCreate() 调用的时候,所以它与第二个日志中的第一行无关,对吗?另外,这种情况只是偶尔发生(8~10%)。
    • 你在读写时都在监听器中获取数据
    • 我用一个 Firebase DB 构建了两个应用程序,这个只用于读取,根本不用于写入。
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多