Firebase всегда возвращает ноль после каждого цикла - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу извлечь базу данных из Firebase. В каждом цикле он показывает описание из database, но после каждого цикла, когда я проверяю его снова для этого описания, он показывает мне null и не только для description, но и для всех других значений. Вот код для извлечения данных из Firebase. Это не показывает какую-либо ошибку. Помоги мне.

public void getDatafromFirebase(){
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                DataSnapshot Videoreference = dataSnapshot.child("Videos");
                for (DataSnapshot videoschild : Videoreference.getChildren()){
                    DataSnapshot description = videoschild.child("Description");
                    DataSnapshot duration = videoschild.child("Duration");
                    DataSnapshot title = videoschild.child("Title");
                    DataSnapshot thumbnail = videoschild.child("Thumbnail");
                    details.setDescription(String.valueOf(description.getValue()));
                    details.setDuration(String.valueOf(duration.getValue()));
                    details.setTitle(String.valueOf(title.getValue()));
                    details.setThumbnail(String.valueOf(thumbnail.getValue()));
                    Log.e("details",details.description);
                    list.add(details);
                }
                Log.e("Size",list.get(0).description);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

1 Ответ

0 голосов
/ 08 сентября 2018

Если я правильно понимаю, вы пытаетесь записать значение вашего свойства description (или любого другого свойства) вне обратного вызова, и вы получаете null, верно?

Это происходит потому, что API-интерфейсы Firebase имеют значение asynchronous, что означает, что метод onDataChange() возвращается сразу после его вызова, и обратный вызов из Задачи, которую он возвращает, будет вызван через некоторое время. Там нет никаких гарантий о том, сколько времени это займет. Таким образом, получение этих данных может занять от нескольких сотен миллисекунд до нескольких секунд. Поскольку этот метод немедленно возвращает значение, значение вашего свойства description, которое вы пытаетесь использовать вне метода onDataChange(), еще не будет заполнено из обратного вызова.

По сути, вы пытаетесь вернуть значение синхронно из асинхронного API. Это не очень хорошая идея. Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.

Быстрое решение этой проблемы - использовать значение description только внутри метода onDataChange(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого post , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

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