Подтвердить что ты не робот

Firebase застревает без соединения INTERNET

В моем приложении я использую Firebase для базы данных. Теперь, когда я слушаю какие-либо изменения в дочерних узлах определенного места, и если нет подключения к Интернету, никакой обратный вызов не запускается. Позывной firebase просто застревает.

Я использую это,

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
firebaseDatabase.setPersistenceEnabled(true);

Таким образом, постоянство включено. Проблема возникает только по одному сценарию. Когда нет данных о локальном сохранении Firebase, и интернет-соединение также недоступно.

Я использую это,

addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Timber.d("Cancelled");
                        }
                    });

Я не получаю ни одного из двух обратных вызовов для этого конкретного сценария.

Что мне делать, чтобы справиться с таким сценарием?

4b9b3361

Ответ 1

Посмотрите, как эти методы запускаются, когда нет возможности подключения:

onCancelled - при возникновении ошибки на стороне сервера. Например, когда пользователь не имеет доступа к указанному node. (Или когда вы достигаете предела соединения на плане Sparkle).

onDataChange - если данные сохранены, он будет читать эти данные. Если нет, этот метод не будет запущен (ваш случай).

В соответствии с Firebase Documentation, если вы хотите проверить, подключено ли устройство к серверу Firebase, вы можете добавить слушателя в .info/connected. Вот так:

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) {
      Toast.makeText(this, "Connected", Toask.LENGTH_SHORT);
    } else {
      Toast.makeText(this, "Not connected", Toask.LENGTH_SHORT).show();
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
  }
});