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ę.
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(). –
@AritraRoy jak sobie z tym poradziłeś? znalazłeś rozwiązanie tego? –
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. –