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

У меня есть сервис 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?

1 Ответ

0 голосов
/ 09 ноября 2018

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

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

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

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

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

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

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

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