Как сохранить асинхронные данные из Cloud Firestore в качестве переменной? - PullRequest
0 голосов
/ 02 мая 2019

Я начинаю изучать Cloud Firestore с использованием Firebase SDK на Android, и я столкнулся с проблемой, когда я получаю данные из базы данных Firestore через OnCompleteListener, а затем пытаюсь сохранить их как переменную , Проблема заключается в том, что после завершения OnCompleteListener и перехода моего Android-приложения к следующей строке кода данные в переменной сбрасываются и не сохраняются.

У меня есть коллекция пользователей, и я пытаюсь получить спорт пользователя для сезона:

db.collection("users").document(mAuth.getCurrentUser().getUid()).collection("seasons").document(seasonName)
                .get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            DocumentSnapshot document = task.getResult();
                            if (document != null && document.exists() && document.getData() != null) {
                                sport = String.valueOf(document.getData().get("sport"));
                                //sport is set to the value
                            }
                        }
                    }
                });
        //Now sport is null

Спорт устанавливается на значение в слушателе, но затем возвращается к нулю после завершения слушателя.

Итак, мой вопрос: как я могу сохранить переменную навсегда, чтобы она не возвращалась к нулю? Есть ли способ получить данные без прослушивателя, чтобы у меня не было этой проблемы, или есть другое решение?

Заранее спасибо!

1 Ответ

1 голос
/ 02 мая 2019

Переменная не «возвращается» к нулю.Проблема заключается в том, что добавленный слушатель вызывается через некоторое неизвестное время после завершения запроса.Вы не знаете, сколько времени это займет.Поскольку время неизвестно, задача немедленно возвращается get(), и обратные вызовы, которые вы к ней прикрепляете, будут вызваны через некоторое время.Поскольку get() возвращается немедленно, переменная sport будет сохранять свое индивидуальное значение null до тех пор, пока не будет вызван обратный вызов.Это означает, что вы должны использовать результаты только из обратного вызова.Или, если вы хотите сохранить его где-то, обращайтесь к нему только тогда, когда вы уверены, что обратный вызов был вызван.

Фактически все API-интерфейсы Firebase являются асинхронными. Прочтите это , чтобы узнать почему.Вам следует ознакомиться с асинхронным программированием, чтобы использовать Firebase SDK.

В частности, для Android вы должны узнать, как работает API задач Play Services .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...