android - firestore onSuccess 监听器不工作
问题描述
我正在尝试从我的数据库中下载一些测验对象。从某个活动的 onCreate 调用以下函数。
private void downloadQuizzesFromCloud(){
String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
final FirebaseFirestore db = FirebaseFirestore.getInstance();
String user_quizzes_path = "users/".concat(user_id).concat("/quizzes");
Query userQuizzes = db.collection(user_quizzes_path);
userQuizzes.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
quizzes.clear();
for (QueryDocumentSnapshot document : task.getResult()) {
Quiz quizDownloaded = getQuizFromCloud(document.getId());
quizzes.add(quizDownloaded);
}
Toast.makeText(QuizzesActivity.this,"downloaded to list ".concat(String.valueOf(quizzes.size()).concat(" quizzes")), Toast.LENGTH_SHORT).show();
//TODO put in recycle adapter
} else { }
}
});
}
(user_quizzes_path 包含存储在云上的测验对象集合的正确路径)
我调试了这个函数,发现在命令之后:
userQuizzes.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
该函数完成执行,即不检查和执行 onComplete 案例,所有这些代码都被跳过。
我试图在 firebase 的文档中找到它,但没有找到任何东西。为什么会发生这种情况,我该如何解决?
在这里希望得到一些帮助,谢谢!
解决方案
使用回调接口。就像下面这样。
private void downloadQuizzesFromCloud(Consumer listener) {
String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
final FirebaseFirestore db = FirebaseFirestore.getInstance();
String user_quizzes_path = "users/".concat(user_id).concat("/quizzes");
Query userQuizzes = db.collection(user_quizzes_path);
userQuizzes.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Quiz> quizzes = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
Quiz quizDownloaded = getQuizFromCloud(document.getId());
quizzes.add(quizDownloaded);
}
listener.onGet(quizzes);
Toast.makeText(QuizzesActivity.this,"downloaded to list ".concat(String.valueOf(quizzes.size()).concat(" quizzes")), Toast.LENGTH_SHORT).show();
//TODO put in recycle adapter
} else { }
}
});
}
interface Consumer {
void onGet(List<Quiz> quizzes);
}
推荐阅读
- css - 使用 CSS/SCSS 在页面上动画显示元素
- ghost-blog - 如何在 Ghost 框架中提供一个方便的链接到下一篇文章(博客)
- database - 如何使 MongoDb(本地数据库)也可以同时通过 Internet 访问
- php - 'MongoDB\Client' 或 'MongoDB\Driver\Manager("mongodb://localhost:27017")' 都不起作用
- imap - 收到 Gimap 准备好请求后出现 imap 错误
- sql - LEFT OUTER JOIN 中的最大行数是多少?
- c - 在 O(n) 运行时间内对数组元素求平方
- c# - 如何在 C# 中打开具有身份验证的文件夹?
- cordova - WkWebView 视口适合“封面”在 iOS 12 中损坏
- react-native - Windows 上的 react-native 0.57.2 捆绑失败