我想在本地存储从云端读取的数据。
为了实现这一点,我使用一个全局变量(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 的文档,但没有找到任何可以使用的东西。 (例如尝试使用“等待”方法)但这没有帮助。
我还能做什么来解决这个同步问题?
我不明白你是否尝试过这个解决方案,但我认为这是更好、更简单的:添加一个onCompleteListener
to the Task
从返回的对象get()
方法,如果任务成功,你就可以做所有的事情,如下所示:
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 循环)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)