Как использовать значение вне функции dataSnapshot? - PullRequest
0 голосов
/ 24 мая 2019

В приведенном ниже коде я получаю количество детей, но я хочу использовать его вне метода onDataChange.

              mRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot)
                    {
                        DateStorage dateStorage = null;
                        for (DataSnapshot result : dataSnapshot.getChildren()) 
                    {


                     Log.e(result.getKey(),result.getChildrenCount() + "");
                      in[0] = result.getChildrenCount();

                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 24 мая 2019

Данные загружаются из Firebase асинхронно. Ваш основной код продолжает выполняться во время загрузки данных, а затем, когда данные становятся доступны, вызывается метод onDataChange. Что это означает, легче всего увидеть, если добавить несколько операторов журнала:

Log.d("TAG", "Before attaching listener");
mRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        Log.d("TAG", "Got data");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});
Log.d("TAG", "After attaching listener");

Когда вы запускаете этот код, он записывает:

Перед подключением слушателя

После подключения слушателя

Получил данные

Вероятно, это не тот порядок, который вы ожидали, но он совершенно нормален при вызове асинхронных API. И это объясняет, почему вы получите неправильное значение, если напечатаете его за пределами onDataChange().

Проблема не в том, что вы не можете использовать данные вне onDataChange(), проблема в том, что вы должны убедиться, что onDataChange() запустил до того, как вы используете данные.

Самый простой способ сделать это - поместить весь код, требующий данных из базы данных , в метод onDataChange. Но вы также можете создать свой собственный интерфейс обратного вызова и передать его в метод, в который вы загружаете данные. Пример обоих этих подходов см. В моем ответе здесь: Метод getContactsFromFirebase () возвращает пустой список

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