Android Firebase – «onDataChange» и «onCancelled» не вызывается без подключения к Интернету

В моем приложении я просто пытаюсь получить прохождение чтения из базы данных Firebase , добавив ListenerForSingleValueEvent в следующий код:

 myRef.child("passages").child(passageNum).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { System.out.println("ON DATA CHANGE"); } @Override public void onCancelled(DatabaseError databaseError) { System.out.println("DATABASE ERROR"); FirebaseErrorHandler.handleDatabaseError(databaseError.getCode(), ReadingActivity.this); } }); 

Он работает отлично, когда есть подключение к Интернету. Однако, когда я намеренно отключает подключение к Интернету, onDataChange ни onDataChange ни onCancelled . Это очень расстраивает, поскольку два из кодов ошибок в databaseError.getCode() связаны с проблемами сетевого подключения.

Если я не смогу получить эти данные из-за отсутствия Интернета, я хочу, по крайней мере, сообщить пользователю, что вместо того, чтобы этот слушатель висел на экране, постоянно загружался. Есть ли способ решить это? Должен ли я просто обратиться Firebase's API REST Firebase's ? По крайней мере, с сетевыми запросами RESTful, они сообщают вам, произошло ли соединение неудачно или нет.

Firebase отделяет поток событий данных (например, onDataChange() ) от других вещей, которые могут произойти. Он будет вызывать onCancelled когда есть причина на стороне сервера для этого (в настоящее время только тогда, когда клиент не имеет разрешения на доступ к данным). Нет причин отменять прослушиватель, просто потому, что нет сетевого подключения.

То, что вы, похоже, ищете, – это способ определить, есть ли сетевое подключение (которое не является задачей для Firebase) или связано ли пользователь с базой данных базы данных Firebase. Последнее вы можете сделать, присоединив слушателя к .info/connected , неявное логическое значение, которое true когда вы подключены к базе данных базы данных Firebase и в противном случае является false . Подробные сведения см. В разделе, посвященном обнаружению состояния соединения .