2017-06-14 120 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

非常感谢你的解释者。我接受了你的答案。再次感谢您的时间和专业知识。 –