2016-08-18 10 views
9

w mojej aplikacji, po prostu starają się odzyskać fragment czytania z mojej bazy danych Firebase dodając ListenerForSingleValueEvent w poniższym kodzie:Android Firebase - „onDataChange” i „onCancelled” nie jest wywołana bez połączenia internetowego

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); 
      } 

     }); 

Działa idealnie dobrze, gdy istnieje połączenie z Internetem. Jednak gdy celowo wyłączam połączenie internetowe, nie są wywoływane ani onDataChange ani onCancelled. Jest to bardzo frustrujące, ponieważ dwa kody błędów w databaseError.getCode() mają związek z problemami z łącznością sieciową.

Jeśli nie mogę uzyskać tych danych z powodu braku internetu, chcę przynajmniej poinformować użytkownika o tym, że zamiast tego, że ten słuchacz wisi na ekranie, ciągle się ładuje. Czy istnieje sposób na rozwiązanie tego problemu? Czy musiałbym uciekać się do interfejsu REST API Firebase's? Przynajmniej z RESTful żądaniami sieciowymi, dadzą ci znać, jeśli połączenie nie powiodło się.

Odpowiedz

5

Firebase oddziela przepływ zdarzeń danych (takich jak onDataChange()) od innych rzeczy, które mogą się zdarzyć. Będzie wywoływał tylko numer onCancelled, gdy wystąpi powód, aby to zrobić (obecnie tylko wtedy, gdy klient nie ma uprawnień dostępu do danych). Nie ma powodu, aby anulować słuchacza, tylko dlatego, że nie ma połączenia sieciowego.

To, czego szukasz, to sposób na wykrycie, czy istnieje połączenie sieciowe (które nie jest zadaniem specyficznym dla Firebase) lub czy użytkownik jest podłączony do zaplecza Bazy danych Firebase. To ostatnie można zrobić, dołączając detektor do .info/connected, niejawnej wartości boolowskiej, która jest true, gdy jesteś podłączony do zaplecza bazy danych Firebase i jest ona inna niż false. Szczegółowe informacje znajdują się w sekcji document on detecting connection state.

+5

To jest rozwiązanie, ale nie pożądane. Mogę sprawdzić dostępność Internetu przed wysłaniem zapytania do bazy danych bazy danych, ale to nie będzie dobrze, ponieważ chcę, aby moja aplikacja była w 100% niedostępna. Przypuśćmy, że gdy uruchamiam aplikację po raz pierwszy bez połączenia z Internetem, baza danych firebase nie ma danych i utknie w wywołaniu zwrotnym. Problem znika w kolejnych przebiegach, jeśli połączenie internetowe jest zapewnione przynajmniej po raz pierwszy. Jak rozwiązać ten scenariusz? Byłoby naprawdę lepiej, gdyby Firebase dostarczyła te informacje przynajmniej w wersji onCancelled(). –

+0

@AritraRoy jak sobie z tym poradziłeś? znalazłeś rozwiązanie tego? –

+3

To naprawdę niefortunne, że muszę sprawdzić flagę przed uruchomieniem dowolnego zapytania. W przypadku detektora zdarzeń ** o pojedynczej wartości **, firebase powinien zwrócić błąd, jeśli nie uda się uzyskać wartości. Obecne zachowanie po prostu popycha całą tę złożoność, z którą ma do czynienia aplikacja. –