Это может быть вызвано тем, что Firebase закрывает соединение из-за неактивности, что происходит только на Android.Из документации Обнаружение состояния соединения :
На Android Firebase автоматически управляет состоянием соединения, чтобы уменьшить пропускную способность и расход батареи.Когда у клиента нет активных прослушивателей, нет ожидающих операций записи или onDisconnect
, и он явно не отключен методом goOffline
, Firebase закрывает соединение через 60 секунд бездействия.
Поскольку вашПриложение не использует базу данных реального времени (вместо этого вы используете Cloud Firestore), никаких других операций записи или других прослушивателей не будет, поэтому соединение закрывается автоматически.Вероятно, вы увидите что-то похожее на приведенное ниже в logcat:
V/FA: Inactivity, disconnecting from the service
В качестве возможного обходного пути вы можете попробовать подключить прослушиватель к любому узлу в базе данных реального времени, чтобы сохранить соединение живым(что-нибудь подойдет, даже если оно на самом деле не существует):
FirebaseDatabase.getInstance().getReference("keepalive").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
// Do nothing - this listener just keeps the connection alive
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.i("Keepalive listener was cancelled");
}
});
В качестве альтернативы, как предлагает Фрэнк ван Пуффелен , вы можете обмануть Firebase, повесив его на соединение, сказавэто позволяет синхронизировать всю базу данных реального времени, используя keepSynced()
на пустой ссылке:
FirebaseDatabase.getInstance().getReference().keepSynced(true);
Вам нужно будет не забыть удалить обработчик keepalive или отменить keepSynced()
, когдавы на самом деле хотите отметить присутствие пользователя как отключенное.
Наконец, в обоих этих примерах вам все еще нужно подключить и использовать .info/connected
слушатель состояния соединения дляобрабатывать изменения в состоянии соединения:
Для многих функций, связанных с присутствием, вашему приложению полезно знать, когда оно подключено к сети или отключено.База данных Firebase Realtime предоставляет специальное местоположение в /.info/connected
, которое обновляется каждый раз, когда изменяется состояние подключения клиента базы данных Firebase Realtime.Вот пример:
DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
System.out.println("connected");
} else {
System.out.println("not connected");
}
}
@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled");
}
});