Firebase добавляет слушателей в адаптеры в Android

Я новичок в firebase, и я пытаюсь обдумать это. У меня есть этот адаптер, который регистрируется в ValueEventListener каждый раз, когда он создается. Если я не отсоединю его, будут ли прослушиватели складываться, когда я поворачиваю свой телефон, и адаптер разрушается / перестраивается во фрагменте? Или firebase достаточно умен, чтобы знать, что этот конкретный слушатель уже существует?

PS: я пытался отменить регистрацию этого прослушивателя в методе onPause фрагмента, использующего его, но firebase, похоже, удаляет мой кеш, поэтому после ротации фрагмента требуется некоторое время, чтобы снова получить данные, что не не бывает раньше.


person frankelot    schedule 08.04.2015    source источник


Ответы (1)


Хороший вопрос. Итак, несколько замечаний:

  1. Куда вы прикрепляете свой прослушиватель? Если вы прикрепите это куда угодно, кроме onResume, он повторно инициализирует ваш прослушиватель. При настройке слушателя он запускает все события для этого конкретного узла. Тем не менее, я по-прежнему выполняю всю свою регистрацию и отмену регистрации по моей ссылке Firebase в onPause и onResume.

  2. #P3# <блочная цитата> #P4# #P5#
  3. Firebase кэширует все данные. Когда фрагмент прикреплен и установлен слушатель, firebase сделает два основных вызова:

    • Первый — запрос на получение кэшированных данных.

    • Второй - запрос к удаленным данным.

    Вызов кеша в первую очередь хорош, потому что он все еще работает в случаях с медленной сетью или без сети. Теперь потерпите... Когда Firebase получит этот моментальный снимок с сетевых серверов, он выполнит комплексную оценку удаленного объекта и локального объекта. И в меру своих возможностей Firebase объединит объекты, используя сложный идентификатор, который использует временные метки и черную магию [необходим источник]. С этим новым снимком, при необходимости, он сохранит его на серверах. Затем **Firebase предоставит вам дату только в том случае, если она отличается от кешированной версии и изменится относительно экземпляра прослушивателя, предоставившего указанные данные. Эта управляемая кешем структура применяется даже в том случае, когда вы сохраните свои данные:

    • Сначала сохранить в кеш.

    • Второй - вызвать обратный вызов.

    • Третья попытка сохранить на сервер.


Чтобы ответить на вопрос

Если вы подключаете свой слушатель к Firebase onPause/onResume, вы снова получите все данные. Единственный способ не получать его снова — поддерживать тот же экземпляр этого слушателя.

Помимо поддержки моего экземпляра слушателя, я также использовал другое решение. На мой взгляд, мне это не по душе. Но все же это то, что я использую чаще всего. Что я делаю, так это

  • Я оставлю себе final List<String> по имени ignoredList. Этот список будет состоять из ключа String, который будет ключом для объекта, который уже есть в вашем адаптере.

  • Затем в onPause я добавлю эти данные в свой ignoredList и обнулю прослушиватель childEvent.

  • После обратного вызова onResume я установил новый экземпляр слушателя childEvent.

  • В onAdded прослушивателя событий я проверяю недавно добавленный объект в своем списке. Если он у меня есть, я удалю его из списка и ничего больше. По сути игнорирование. Если объекта нет в моем ignoredList, я буду обращаться с ним как обычно. Если я получу его от одного из обратных вызовов, отличного от onAdded (т.е. onRemoved onChanged или onMoved), то я заменю это событие на этот объект в списке и удалю из ignoredList.

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

Я всегда активно ищу лучшие стратегии для этого, и если найду, поделюсь. Между тем, это решение отлично работает для моих приложений.

person Chad Bingham    schedule 16.04.2015
comment
Что ж, ваш ответ был точным, я могу сказать, что вы тоже некоторое время ломали голову над firebase, что делает нас двоих. Ваше решение довольно хорошее, но, как я его вижу, ваши данные будут храниться дважды (первый в вашем массиве ingoredList, а второй в кеше firebase автоматически делает для вас, тем не менее это сработает, по крайней мере, теоретически). Итак, имея это в виду, вот что я в итоге сделал: есть бета-функция, которая позволит вам сохранить ваши данные в кэше, даже если все слушатели будут удалены Firebase.getDefaultConfig().enablePersistence(); - person frankelot; 17.04.2015
comment
Благодаря этому вам не нужно беспокоиться о потере данных, и вы сохраняете их только один раз. Для получения дополнительной информации: groups.google.com/forum/#! тема/firebase-talk/gYlnLgQ-Yhk - person frankelot; 17.04.2015
comment
Ах очень приятно. Я не смотрел на это. Мое решение действительно хорошо только для небольших списков. Скорее взлом. - person Chad Bingham; 17.04.2015
comment
Красиво создано для новичков вроде меня.. :) - person kirtan403; 27.07.2016
comment
Предположим, у меня есть служба синхронизации, которая работает в фоновом режиме и будет синхронизироваться только в том случае, если пользователь прошел проверку подлинности. В этом случае я должен использовать Firebase Auth Listener только в качестве фоновой службы или я должен добавить слушателей во все места, такие как регистрация, вход и т. д. Итак, должен ли я использовать несколько или один Auth Listener?? @ЧадБингэм - person Sp4Rx; 15.11.2016
comment
Я бы рекомендовал ограничить ваши сетевые звонки рамками вашей деятельности. - person Chad Bingham; 15.11.2016