【发布时间】:2018-12-29 14:03:23
【问题描述】:
我想将我从云端读取的数据存储在本地。
为此,我使用了一个全局变量 (quizzes) 来保存所有数据。
为此,当我构建 Quiz 对象时,我需要确保在创建它们之前,相关数据已经从云端下载。因为从 firestore 读取数据时,它是异步发生的。
我之前没有强制执行此操作(等待读取完成) - 我只是使用了 onSuccess 侦听器,但我遇到了同步问题,因为在我使用来自的数据创建 Quiz 对象之前读取任务尚未完成云。
我用一种非常原始的“忙等待”方式解决了这个问题,直到从云端读取完成。我知道这是非常愚蠢的做法,是一种非常糟糕的做法,并且会使应用程序变得超级慢,我相信有更好的方法来解决这个问题。
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 的文档,但没有找到任何可以使用的东西。 (例如尝试使用“等待”方法)但没有帮助。
我还能做些什么来解决这个同步问题?
【问题讨论】:
-
你可以使用 MutableLiveData,观察 onChange 并用你的数据做你想做的事
-
作为一般说明,没有人应该尝试将异步操作转换为移动应用程序中的同步操作。这会导致问题。请阅读为什么所有 Firebase API 都是异步的:medium.com/google-developers/…
标签: android firebase android-asynctask google-cloud-firestore