У меня есть сервис 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 для
.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
переопределит это и обеспечит непрерывную связь с базой данных. Вы также можете посмотреть ответы в этом посте.
Есть также еще один пост, который я рекомендую вам прочитать для лучшего понимания.