2017-06-14 9 views
0

Ich habe ein Problem mit diesem Code, der fast wortwörtlich aus der Firebase SDK-Java-Dokumentation kopiert wurde, um zu funktionieren. Ich bin neu in einer echten Sprache wie Java, die von einem Webdev-Hintergrund in PHP und JavaScript kommt.Ergreifung von Daten aus Firebase mit Java

Grundsätzlich wird der addListenerForSingleValueEvent nicht ausgelöst, um mir Daten zurück zu geben. Das ist mir aufgefallen, weil der Systemausdruck nicht ausgelöst wurde. Ich gehe daher davon aus, dass das Hörereignis nicht ausgelöst wurde.

Ich vermute, dass dies mit meinem begrenzten Wissen, wie die Funktion selbst funktioniert, zu tun hat, da mir strukturelles Wissen darüber fehlt, wie die Klasse und die Funktionen miteinander interagieren.

Jede Hilfe wäre dankbar, danke.

class FireBase { 
public static void main(String[] args) throws IOException { 
    // Fetch the service account key JSON file contents 
    FileInputStream serviceAccount = new FileInputStream("key.json"); 

    // Initialize the app with a service account, granting admin privileges 
    FirebaseOptions options = new FirebaseOptions.Builder() 
     .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
     .setDatabaseUrl("https://ssworks-adwords.firebaseio.com/") 
     .build(); 
    FirebaseApp.initializeApp(options); 

    // As an admin, the app has access to read and write all data, regardless of Security Rules 
    DatabaseReference ref = FirebaseDatabase 
     .getInstance() 
     .getReference("petitions"); 
    ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      System.out.println("Before Get Value"); 
      Object document = dataSnapshot.getValue(); 
      System.out.println(document); 
     } 

     @Override 
     public void onCancelled(DatabaseError arg0) { 
      // TODO Auto-generated method stub 
      System.out.println("This didn't work"); 
     } 
    }); 
} 

} 
+0

Was ist Ihre Ausgabe? –

+0

Nichts, ich sehe nicht einmal die Ausgabe "Before Get Value". Ich glaube also nicht, dass die Funktion überhaupt abfeuert. –

Antwort

2

Wenn Sie ein Java-Programm, das auf der Kommandozeile über einige Klassen Hauptfunktion aufgerufen wird, müssen Sie von der Rückkehr, bevor die Datenbank Zuhörern Feuer, die Hauptfunktion verhindern. Andernfalls wird das Programm sofort beendet und der Zuhörer wird nie feuern. Beachten Sie, dass alle Firebase-Listener asynchron sind und Firebase seinen eigenen Daemon-Thread für die Kommunikation mit dem Server verwaltet.

Für den Fall ein einfaches Programm warten machen, bis ein Zuhörer auslöst, können Sie diese Art von Muster verwenden, um den Haupt-Thread zu blockieren für den Hörer warten:

CountDownLatch latch = new CountDownLatch(1); 
ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println("onDataChange: " + dataSnapshot); 
     latch.countDown(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     System.out.println("onCanceled: " + databaseError); 
     latch.countDown(); 
    } 
}); 
latch.await(); 

eine CountDownLatch Verwendung ist nicht die einzige Möglichkeit. Sie können tun, was Sie wollen, um sicherzustellen, dass der Prozess nicht aufhört. Sie können den Hauptthread sogar länger einschlie- ßen, als der Hörer abfeuern muss.

+0

Das hat perfekt funktioniert. Jetzt muss ich herausfinden, was ein CountDownLatch ist. –

+0

CountDownLatch ist eine Art von Synchronisationswerkzeug, das einen Ausführungs-Thread darauf warten lässt, dass andere Dinge zuerst ausgeführt werden. In meinem Fall wird der Hauptthread so lange nicht fortgesetzt, bis der Ereignis-Listener asynchron in einem anderen Thread ausgelöst wird. (Und wenn Sie diese Antwort akzeptieren könnten, würde ich das schätzen.) –

+0

Vielen Dank auch für den Erklärer. Ich habe deine Antwort angenommen. Nochmals vielen Dank für Ihre Zeit und Ihr Fachwissen. –

Verwandte Themen