有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以订购firebase addValueEventListeners,以便它们按特定顺序执行吗?

大家好,我正在Android Studio上用Java开发一个聊天应用程序,试图从firebase实时数据库读取数据,该数据库的结构如下

{
"Chats":{
    "<chatID>":{
        "<title>",       
        "<lastmessage>"
        "<timestamp>"
        "Users":{                      
            "<user1ID>",
            "<user2ID>"
            }
        }
    },
"Users":{
    "<userID>":{
        "<name>",
        "<email>",
        "Contacts":{
            "<contactID>",
            },  
        "Chats":{                
            "<chatID>"              
            }
        }
    }

}

目前,我有3个独立的事件侦听器,它们将读取的数据添加到2D数组中

ArrayList<ArrayList<String>> chatsDetails; //[("chatID","timestamp",userUID","userName","userEmail"),...]

代码很长,但事件侦听器的标题(重现问题所需的最短代码)是这样的

/*Listener 1- populate ArrayList with chat ID from Firebase database*/
databaseReference.child("users").child(mAuth.getCurrentUser().getUid()).child("chats").addValueEventListener(new ValueEventListener() {
    
});

/*Listener 2- populate 2d ArrayList with users uid and timestamp from Firebase database*/
databaseReference.child("chats").addValueEventListener(new ValueEventListener() {

    //requires the chat id from listener 1
});

/*Listener 2- whenever values under users changes, update user email and name in 2D array*/
databaseReference.child("users").addValueEventListener(new ValueEventListener() {

    //requires the user uid from listener 2
});

具体问题: 问题是,当我对控制台进行日志记录时,我意识到侦听器并没有按照我要求的顺序运行。这会导致无法检索用户的姓名和电子邮件并将其存储到ArrayList中

期望的行为: 我想知道是否有办法让事件监听器一个接一个地运行(因此日志控制台应该显示按该顺序执行的监听器1、2、3)

我试图寻找OnCompleteListeners,但找不到任何适合这个的,我尝试了嵌套addValueEventListeners,但没有成功。问题是,当向数据库中添加一个新的侦听器时,它会同时触发所有3个侦听器,因此我不确定如何使它们按顺序工作。任何指导都将不胜感激,谢谢


共 (1) 个答案

  1. # 1 楼答案

     .addValueEventListener()
    

    当数据库更新时,它会触发此函数运行。假设你在设备上有Firebase数据的副本 一切都正确同步,然后什么也没有发生(你不必使用互联网连接来获取数据,只需询问数据库是否进行了任何修改),现在你从数据库获得的所有数据都来自Firebase数据库的本地数据库版本。 这只是firebase系统工作原理的细节
    如果插入了数据,则只会得到发生的修改+在“本地Firebase db”中未更改的数据。
    所以现在,当“远程Firebase db”上发生修改时,您需要通过清除重新填充将数据存储在列表中
    然后处理设备上的列表