2017-06-14 58 views
0

我在下面的代碼中出現了一個問題,它幾乎逐字地從Firebase SDK Java文檔中複製過來。我是一個真正的語言的新手,例如來自PHP和JavaScript中的webdev背景的Java。使用Java從Firebase中抓取數據

基本上addListenerForSingleValueEvent不會觸發來給我回數據。我注意到這一點,因爲系統打印輸出不會觸發,因此我認爲聽音事件沒有觸發。

我懷疑這與我有限的知識如何在函數本身的工作方式有關,比如我錯過了一些關於類和函數如何相互作用的結構知識。

任何幫助,將不勝感激謝謝。

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

你的輸出是什麼? –

+0

沒什麼,我甚至都不會看到「獲取價值之前」輸出。所以我不認爲這個功能甚至是解僱了。 –

回答

2

如果您有威盛一些類的主要功能在命令行中調用java程序,你必須防止的主要功能從數據庫監聽器觸發之前返回。否則,程序將立即終止,並且偵聽器將永遠不會觸發。請記住,所有Firebase偵聽器都是異步的,並且Firebase管理自己的守護程序線程以便與服務器進行通信,這一點非常重要。

爲了使一個簡單的程序,等到監聽器觸發,你可以用這種方式來阻止主線程等待聽者的情況:

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(); 

使用的CountDownLatch是不是你唯一的選項。你可以做任何你想確保過程不會停止的事情,包括簡單地將主線程休眠的時間長於聽者發射的時間。

+0

這工作完美。現在我需要研究一下CountDownLatch的功能。 –

+0

CountDownLatch一種同步工具,可以讓一個執行線程先等待一些其他的事情完成。在我的情況下,它保持主線程繼續,直到事件偵聽器在不同的線程中異步觸發。 (如果你能接受這個答案,我會很感激的。) –

+0

非常感謝你的解釋者。我接受了你的答案。再次感謝您的時間和專業知識。 –