База данных реального времени Firebase .info / connected False, когда оно должно быть True

1

У меня есть сервис Android, который вызывает это на onCreate:

FirebaseDatabase database = FirebaseDatabase.getInstance();
database.getReference(".info/connected").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
        Log.d(TAG, "connected: " + snapshot.getValue(Boolean.class));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        Log.w(TAG, "Failed to read value.", error.toException());
        }
});

Я заметил, что когда я переключаю Wi-Fi и сотовые данные, я в конечном итоге вижу сообщение "connected: false" и сообщение "connected: true" отсутствует. Наряду с базой данных Firebase в реальном времени, я также запускаю Firestore в сервисе, и Firestore правильно подключается на этом этапе.

Затем я запускаю службу Android для запуска этого кода:

FirebaseDatabase.getInstance().getReference("random/data").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
           // This method is called once with the initial value and again
           // whenever data at this location is updated.
           boolean connected = snapshot.getValue(Boolean.class);
           Log.d(TAG, "random data: " + connected);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
           // Failed to read value
           Log.w(TAG, "cancelled system/online.", error.toException());
        }
});

И теперь, я получаю успешное чтение, и "подключено: правда" печатается.

Что происходит? Зачем мне нужно читать из firebase для .info/connected для запуска?

Теги:
firebase
firebase-realtime-database

1 ответ

2
Лучший ответ

Зачем мне нужно читать из firebase для .info/connected для запуска?

Ответ остается в официальной документации:

База данных Firebase Realtime предоставляет специальное расположение по адресу /.info/connected которое обновляется каждый раз, когда изменяется состояние подключения клиента Firebase Realtime Database.

/.info/connected - это логическое значение, которое не синхронизируется между клиентами базы данных в реальном времени, поскольку это значение зависит от состояния клиента. Другими словами, если один клиент читает /.info/connected как false, это не гарантирует, что отдельный клиент также будет читать false.

На Android Firebase автоматически управляет состоянием соединения, чтобы уменьшить пропускную способность и расход батареи. Когда у клиента нет активных прослушивателей, нет ожидающих операций записи или onDisconnect, и он явно не отключен методом goOffline, Firebase закрывает соединение через 60 секунд бездействия.

Таким образом, на Android вы также можете воспользоваться преимуществами управления состоянием соединения. Поэтому, как только вы реализуете вышеупомянутое решение, вы увидите, что SDK управляет этим динамически таким образом, что соединения автоматически отключаются, если не подключены прослушиватели и если в течение последних 60 секунд в приложении не выполнялись операции записи с использованием setValue(), но наличие ValueEventListners переопределит это и обеспечит непрерывную связь с базой данных. Вы также можете посмотреть ответы в этом посте.

Есть также еще один пост, который я рекомендую вам прочитать для лучшего понимания.

  • 0
    Все ли в порядке, могу ли я помочь вам с другой информацией?
  • 1
    Вау, это может быть ответом! То есть, вы говорите, что если я просто запустите приложение на 60 секунд, оно перейдет к «подключено: ложно», а я ничего не сделаю? Мне нужно проверить это, чтобы подтвердить эту гипотезу.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню