2016-05-08 14 views
2

Ich habe versucht, meine Daten für Firebase-Datenbank mit Java-Code (nicht-Android) zu bekommen. Ich habe die gleiche Methode wie ich in Android App abgerufen. Aber es bekommt keine Daten.Firebase mit Java (nicht-Android) Informationen abrufen

Firebase firebase = new Firebase("https://------.firebaseIO.com"); 
    firebase.addValueEventListener(new ValueEventListener(){ 
     @Override 
     public void onDataChange(DataSnapshot ds) { 
      long i = ds.child("Users").getChildrenCount(); 
      userlist = new String[(int)i]; 
      int j = 0; 
      for(DataSnapshot each_ds : ds.getChildren()){ 
       userlist[j] = each_ds.child("username").getValue().toString(); 
       System.out.println(userlist[j]); 
       j++; 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError fe) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    }); 
+1

Mögliche Duplikate von [Grab Daten von firebase mit Java] (https://stackoverflow.com/questions/44548932/grab-data-from-firebase-with-java) –

Antwort

4

Die Firebase Client stellt die Verbindung zum Server in einem separaten Thread und startet dort Daten zu hören. Der Hauptthread Ihres Programms wird fortgesetzt und beendet, wenn kein Code mehr ausgeführt werden muss. Dies geschieht häufig, bevor Firebase die ersten Daten zurückerhält (was einige Sekunden dauern kann).

So müssen Sie warten, bis die Daten zurückkommen. Ich tue dies in der Regel durch eine einfache Thread.sleep() am Ende meines Programms Einsetzen für Prüfprogramme:

Thread.sleep(20000); 

Aber in einem realen Programm würden Sie wahrscheinlich eine bessere Ausgangsbedingung, um herauszufinden wollen. Zum Beispiel, hier verwenden wir ein CountDownLatch den Hauptcode Wartezeit zu machen, bis der Vorgang abgeschlossen ist:

final CountDownLatch sync = new CountDownLatch(1); 
ref.push().setValue("new value") 
    .addOnCompleteListener(new OnCompleteListener<Void>() { 
     public void onComplete(Task<Void> task) { 
     sync.countDown(); 
     } 
    }); 
sync.await(); 

Sie diesen Ansatz nicht von der Art und Weise in Android verwenden, da es die Haupt/UI-Thread blockieren und verlassen Die App reagiert nicht.

+0

Hallo Frank, was wäre ein guter Ansatz in Android? Grüße. –

+1

In Android existiert dieses Problem nicht, da die App nicht automatisch beendet wird. Sie werden stattdessen einfach reagieren, sobald die Daten eintreffen. Siehe http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –