2016-06-15 16 views
14

In meiner App verwende ich Firebase für die Datenbank. Wenn ich jetzt auf Änderungen an untergeordneten Knoten eines bestimmten Ortes horche und keine Internetverbindung besteht, wird kein Rückruf ausgelöst. Der Firebase-Anruf bleibt einfach hängen.Firebase bleibt auf keine Internetverbindung stecken

ich dies verwenden,

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

So, Ausdauer aktiviert ist. Das Problem tritt nur in einem Szenario auf. Wenn keine Daten zur lokalen Persistenz von Firebase vorliegen und die Internetverbindung nicht verfügbar ist.

ich dies verwenden,

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

         } 

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

Ich bin nicht für das jeweilige Szenario eine der beiden Rückrufe zu bekommen.

Was soll ich tun, um diese Art von Szenario zu bewältigen?

+0

Ich erfahre das gleiche Problem gerade jetzt. Hast du etwas getan, um es zu lösen? Wenn nicht, muss ich möglicherweise auf ihre REST API zurückgreifen. – Rafi

+0

Welche SDK-Version verwenden Sie für Firebase? –

+1

Ich habe das Problem gelöst, indem ich die Informationen aus dieser Antwort verwendet habe: http://stackoverflow.com/questions/39021378/android-firebase-ondatachange-and-oncancelled-not-being-called-with-no-int/39021671 # 39021671 – Rafi

Antwort

5

Mal sehen, wie diese Methoden ausgelöst werden, wenn keine Verbindung besteht:

onCancelled - wenn es ein serverseitige Fehler ist. Zum Beispiel, wenn der Benutzer keinen Zugriff auf den angegebenen Knoten hat. (Oder wenn Sie das Verbindungslimit im Sparkle-Plan erreichen).

onDataChange - Wenn Daten bestehen bleiben, werden diese Daten gelesen. Wenn nicht, wird diese Methode nicht ausgelöst (Ihr Fall). Wenn Sie überprüfen möchten, ob das Gerät mit dem Firebase-Server verbunden ist, können Sie einen Listener zu .info/connected hinzufügen. Gefällt mir:

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) { 
    } 
}); 
+1

Ich frage mich woher Sie wissen, dass wir diese Referenz ".info/connected" holen müssen, um den Verbindungsstatus zu überprüfen. – Herry

+0

Ich habe den Firebase-Dokumentationslink zu meiner Antwort hinzugefügt. @Herry –

+0

'verbunden' ist falsch, auch wenn Internet verfügbar ist – Shruti

Verwandte Themen