android - firestore 读取是异步的,我想要同步行为

标签 android firebase android-asynctask google-cloud-firestore

我想在本地存储我从云端读取的数据。 为了实现这一目标,我使用全局变量(quizzes)来保存所有数据。

为此,当我构建 Quiz 对象时,我需要确保在创建它们之前,相关数据已从云端下载。因为从 firestore 读取数据时,它是异步发生的。

我之前没有强制执行此操作(等待读取完成) - 我只是使用 onSuccess 监听器,并且遇到同步问题,因为在创建测验之前读取任务尚未完成具有来自云端的数据的对象。

我用一种非常原始的“忙等待”方式修复了这个问题,直到从云端的读取完成。我知道这是非常愚蠢的,是一种非常糟糕的做法,并且使应用程序变得非常慢,而且我确信有更好的方法来解决这个问题。

 private void downloadQuizzesFromCloud(){


    String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
    final FirebaseFirestore db = FirebaseFirestore.getInstance();
    CollectionReference quizzesRefrence = db.collection("users").document(user_id).collection("quizzes");

    Task<QuerySnapshot> task = quizzesRefrence.get();
    while(task.isComplete() == false){
        System.out.println("busy wait");
    }


    for (QueryDocumentSnapshot document : task.getResult()) {
        Quiz quizDownloaded = getQuizFromCloud(document.getId());
        quizzes.add(quizDownloaded);
    }

}

我在网上查看了 firestore 和 firebase 的文档,没有找到任何可以使用的东西。 (例如尝试使用“等待”方法)但这没有帮助。

我还能做什么来解决这个同步问题?

最佳答案

我不明白您是否尝试过这个解决方案,但我认为这是更好、更简单的:添加 onCompleteListenerTaskget() 返回的对象方法,如果任务成功,你就可以做你所有的事情了,就像这样:

private void downloadQuizzesFromCloud(){


String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
final FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference quizzesRefrence = db.collection("users").document(user_id).collection("quizzes");

quizzesRefrence.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccesful()) {
               for (QueryDocumentSnapshot document : task.getResult()) {
                    Quiz quizDownloaded = getQuizFromCloud(document.getId());
                    quizzes.add(quizDownloaded);
               }
             }
         });
}
}

这样,一旦下载了数据,您就可以完成所有需要做的事情(这里是 for 循环)

关于android - firestore 读取是异步的,我想要同步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53970276/

相关文章:

javascript - 为什么当我将 Base64 图像上传到 firebase 时,它​​会在存储中显示扩展名 application/octet

java - 必须从工作线程调用publishProgress方法,当前推断的线程是主线程

android - 重新创建 Activity 后,我用什么来恢复它的状态?

android - 意外的 CoordinatorLayout 行为

android - 发布 JSOUP 文档以登录网站

Android共享元素转换: hero view gets drawn in front of other

java - GCM :Device can send message but not registered

java - 将图库照片复制到我的应用程序的文件夹中

node.js - Firebase 云功能不发送异步推送通知

android - Firebase 卡在没有互联网连接上