FireStore onSuccess слушатель не работает - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь загрузить некоторые объекты викторины из моей базы данных.Следующая функция вызывается из 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 содержит правильный путь к коллекции объектов Quiz, хранящихся в облаке)

Я отладил эту функцию и нашелчто после команды:

 userQuizzes.get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()

Функция завершает выполнение, то есть случаи onComplete не проверяются и не выполняются, и весь этот код просто пропускается.

Я пытался найти этопо документации firebase но ничего не нашел.Почему это происходит и как я могу это исправить?

Буду признателен за помощь здесь, спасибо!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Использовать интерфейс обратного вызова.Так же, как это ниже.

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);
 }
0 голосов
/ 29 декабря 2018

onComplete вызывается, когда операция чтения завершена с серверов Firestore.Если он не вызывается, я вижу две возможные причины:

  1. Вы не подключены к серверу.Если вы не читали данные раньше (а это находится в локальной базе данных, которую поддерживает клиент Firestore), это означает, что чтение никогда не завершается локально.
  2. Вы не думаете асинхронно.Обратите внимание, что данные считываются с сервера асинхронно, и между вызовом get() и срабатыванием onComplete может пройти некоторое время.Чтобы проверить, так ли это, установите точку останова на if (task.isSuccessful()) { и запустите приложение в отладчике.Точка останова сработает при чтении данных с сервера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...