2016-09-13 5 views
0
public class DataService { 

    private static DataService ourInstance = new DataService(); 
    private DatabaseReference mDatabase; 


    public static DataService getInstance() { 
     return ourInstance; 
    } 

    public ArrayList<UserDatabase> getFriendList() { 

     mDatabase = FirebaseDatabase.getInstance().getReference().child("users"); 
     final ArrayList<UserDatabase> list = new ArrayList<>(); 

     mDatabase.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       UserDatabase userDatabase = dataSnapshot.getValue(UserDatabase.class); 
       list.add(userDatabase); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) {} 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) {} 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) {} 

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

     return list; 
    } 
} 
aktualisieren

Ich versuche, meine Benutzerdatenbank aus dem Knoten users abzurufen. Es verhält sich wirklich komisch. Wenn ich einen Haltepunkt an der Funktion onChildAdded einstelle, ruft es alle Benutzer ab und fügt sie der Liste hinzu.ArrayList nicht innerhalb onChildAdded Funktion

Allerdings, wenn ich dort keinen Haltepunkt setze, bekommt es nichts und die Listengröße ist 0. Hat jemand eine Idee was los ist? Danke im Voraus!

+0

Aber dann wird es vielleicht wieder und überschrieben genannt zu werden. Kannst du 'list' nicht als Feld verwenden? –

+0

ich glaube nicht, dass es überschrieben wird. Wenn ich einen Haltepunkt einfüge, gibt er in der Rückkehrliste nach dem gesamten Prozess die richtigen Daten zurück. aber wenn nicht, geht es einfach nicht an die onChildAdded Funktion –

+0

Ich bin nicht wirklich vertraut mit Android/Firebase, aber wann heißt der Listener? –

Antwort

5

Daten werden asynchron von Firebase geladen und synchronisiert.

Es ist am einfachsten zu sehen, was Ihr Problem verursacht, wenn Sie ein paar gut platzierte Logging-Anweisungen hinzufügen:

public ArrayList<UserDatabase> getFriendList() { 

    mDatabase = FirebaseDatabase.getInstance().getReference().child("users"); 
    final ArrayList<UserDatabase> list = new ArrayList<>(); 

    System.out.println("Attaching listener"); 
    mDatabase.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      System.out.println("Got data"); 
     } 

     public void onChildChanged(DataSnapshot dataSnapshot, String s) {} 
     public void onChildRemoved(DataSnapshot dataSnapshot) {} 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) {} 
     public void onCancelled(DatabaseError databaseError) {} 
    }); 

    System.out.println("Returning list"); 
    return list; 
} 

Die Ausgabe in dieser Reihenfolge gedruckt werden:

Hörer Anbringen

Wiedergabeliste

Erhaltene Daten

Das ist wahrscheinlich nicht die Reihenfolge, die Sie erwartet haben. Aber es erklärt, warum die Liste leer ist, wenn Sie den Code ausführen, wie es ist.

Der Grund dafür ist, dass Firebase die Daten asynchron lädt und synchronisiert. Wie die meisten modernen Web-APIs wartet es nicht auf die Rückkehr des Ergebnisses (das würde zu einer schrecklichen Benutzererfahrung führen), sondern lässt stattdessen das Programm weiterlaufen und ruft in seinen Code zurück, wenn es (neue) Daten erhält.

Der Weg, um mit diesem Verhalten umzugehen ist, den Fluss Ihres Programms neu zu gestalten von "zuerst die Freundesliste holen, dann xyz damit machen" bis "wann immer sich die Freundesliste ändert, macht xyz damit".

Zum Beispiel sagen, dass Sie einfach ausdrucken möchten, wie viele Freunde es gibt. Ihr aktueller Ansatz ist wahrscheinlich:

ArrayList<UserDatabase> friends = getFriendList(); 
System.out.println("There are "+friends.size()+" friends"); 

Mit Firebase ein Weg, dies zu handhaben ist, die Operation zu bewegen ingetFriendList():

public void getFriendList() { 

    mDatabase = FirebaseDatabase.getInstance().getReference().child("users"); 
    final ArrayList<UserDatabase> list = new ArrayList<>(); 

    mDatabase.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      UserDatabase userDatabase = dataSnapshot.getValue(UserDatabase.class); 
      list.add(userDatabase); 
      System.out.println("There are "+friends.size()+" friends"); 
     } 

     public void onChildChanged(DataSnapshot dataSnapshot, String s) {} 
     public void onChildRemoved(DataSnapshot dataSnapshot) {} 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) {} 
     public void onCancelled(DatabaseError databaseError) {} 
    }); 

} 
+0

Es gibt eine [neue Frage] (http://stackoverflow.com/q/39518283/4815718), die im Wesentlichen eine dup von diesem Problem ist. Ich habe darauf geantwortet und einen Link zur Verfügung gestellt. Fühlen Sie sich frei, die neue Frage als dup zu schließen, wenn Sie möchten. –

Verwandte Themen