onDataChange вызывается более одного раза, когда в firebase включен оффлайн - PullRequest
1 голос
/ 21 января 2020

Я боролся с этим более половины дня и в конце концов решил поставить здесь свой вопрос.

Я использую базу данных Firebase в реальном времени для разработки приложения Android. Я включил автономное разрешение.

Я создаю новый объект ValueEventListener с методом onDataChange, как показано ниже:

changeListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
...}};
dbRef.addValueEventListener(changeListener);

Через другой фрагмент в приложении я удалить элемент, на который указывает dbRef. Предположим, изначально у меня было десять элементов в dbRef. Если я поставлю точку останова в коде onDataChange, я увижу, что он вызывается три раза подряд. В первый раз dataSnapShot содержит девять элементов. Во второй раз в нем десять элементов (включая только что удаленный), и, наконец, в третий раз в нем снова девять элементов.

Обратите внимание, если я отключаю офлайн настойчивость, эта проблема не произойдет. Этого не произойдет, если я вручную удалю элемент из консула базы данных. В обоих случаях onDataChange вызывается только один раз.

Я также правильно добавляю слушатель в метод onResume в своем фрагменте и удаляю его в моей паузе.

Мои вопросы:

  1. Это ожидаемое поведение?
  2. Если да, то почему это происходит?
  3. Есть ли способ избежать три звонка на onDataChange?

Заранее большое спасибо

1 Ответ

1 голос
/ 21 января 2020

Я нашел достойный способ справиться с этим.

Во фрагмент, в котором я удаляю элемент в dbRef, вместо удаления элемента и немедленного возврата к этому фрагменту (который содержит значениеEventlistener), я добавляю прослушиватель успеха, как показано ниже:

dbRef.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    getFragmentManager().popBackStackImmediate();
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {

                                }
                            });

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

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