我一直在尝试使用java代码(非android)为firebase数据库获取数据。我使用了和我在安卓应用程序中检索相同的方法。但它没有得到数据。
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.
}
});
Firebase客户端在一个单独的线程中连接到服务器,并开始在那里侦听数据。当没有更多代码可执行时,程序的主线程会继续并退出,这通常发生在Firebase取回第一个数据之前(可能需要几秒钟)。
因此,您将不得不等待数据返回。对于测试程序,我通常会在程序末尾插入一个简单的Thread.sleep()
:
Thread.sleep(20000);
但在一个真正的程序中,你可能想找出一个更好的退出条件。例如,在这里,我们使用CountDownLatch
使主代码等待,直到操作完成:
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();
顺便说一句,不要在Android中使用这种方法,因为它会阻塞主/UI线程,使应用程序没有响应。