首页 > 解决方案 > 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 的文档中找到它,但没有找到任何东西。为什么会发生这种情况,我该如何解决?

在这里希望得到一些帮助,谢谢!

标签: androidfirebasegoogle-cloud-firestore

解决方案


使用回调接口。就像下面这样。

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);
 }

推荐阅读