2016-05-23 11 views
0

Ich versuche, eine grundlegende Verbindung zu Firebase zu machen und einige Daten von Firebase db, aber vor dem Absetzen des Rückrufs, mein Haupt-Thread tritt aus dem Kontext und ich nicht Bekommen irgendwelche Daten im Gegenzug. Unten ist mein Code:Main Thread wartet nicht auf Ereignisse oder Callbacks zu feuern

public class UserStore { 
    private Firebase rootRef_; 
    private UserDetails userDetails; 

    public UserStore() { 
     rootRef_ = new Firebase("https://<FIREBASE-APP>.firebaseio.com/"); 
    } 

    public UserDetails getUserDetails(String mailId) { 
     mailId = mailId.toLowerCase().replace(".", ","); 
     rootRef_.child("users/" + mailId).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot != null) { 
        System.out.println("user data snapshot: " + dataSnapshot.toString()); 
        UserStore.this.userDetails = dataSnapshot.getValue(UserDetails.class); 
       } else { 
        System.out.println("data snapshot is null!!"); 
       } 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 
     return userDetails; 
    } 
} 

Ich bekomme die richtige Antwort auf die Abfrage, aber es dauert Zeit. Ich habe versucht, den Schlaf in dieser Methode zu verwenden. Es hat gut funktioniert, aber dann wird es nicht in Echtzeit sein.

Gibt es sowieso, in denen ich die Echtzeit-Antwort bekommen kann?

+1

Was meinst du mit Echtzeit? Natürlich wird es einige Zeit dauern, um die Daten aus einer entfernten Datenbank zu holen. Sie können einen Listener für den Thread haben, sodass beim Abrufen der Daten ein Funktionsrückruf erfolgt. –

+0

bin ich rechts Sie verwenden Hörer nur zum Laden von Daten _once_? Wenn ja, ist es besser, eine Synchronisierungs-API zu verwenden. –

+0

Ja, natürlich, jeder Anruf braucht Zeiten, aber ich meinte, es dauert eine beträchtliche Zeit, obwohl ich eine sehr kleine Datenbank (10 Schlüssel-Wert-Paare) habe. Es dauert mehr als 7-8 Sekunden. Ja, ich habe einen Listener, aber das Problem ist, dass vor dem Erhalten eines Ereignisses der Hauptthread beendet wird. Ich wollte also wissen, ob es eine Möglichkeit gibt, den Hauptthread für die genaue Zeit anzuhalten, in der ein Ereignis eintritt, außer Schlaf oder Schlaf ist der einzige Weg. Wenn ich hier Schlaf verwende, dann muss ich einen fest codierten Wert eingeben, der größer als die tatsächliche Ladezeit sein kann. – Rana

Antwort

0

Sie senden UserDetail zurück, bevor der Rückruf abgeschlossen ist. Dies ist wirklich über Async-Code-Organisation statt Firebase.

public void getUserDetails(String mailId) { 
     mailId = mailId.toLowerCase().replace(".", ","); 
     rootRef_.child("users/" + mailId).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot != null) { 
        System.out.println("user data snapshot: " + dataSnapshot.toString()); 
        UserDetail userDetails = dataSnapshot.getValue(UserDetails.class); 
        //DO SOMETHING WITH USER DETAILS HERE! 
       } else { 
        System.out.println("data snapshot is null!!"); 
       } 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 
     //DONT RETURN USER DETAILS HERE 
    } 

Weitere Informationen finden Sie aktuelle AsyncTask oder RxJava with Android