Firebase RealTime データベースから wgID を取得したいのですが、これは /WG/FlatNumber/ の値として配置されています。コードは次のとおりです。
主な活動:
System.out.println("1");
dbContact.schreibeFlatObjekt();
System.out.println("7");
schreibeFlat オブジェクト:
//wgID is global
private String wgID;
public schreibeFlatObjekt(){
//CountDownLatch to wait for the Listener
final CountDownLatch cdl = new CountDownLatch(1);
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("3");
//Getting the Data from the snapshot
wgID = (String) dataSnapshot.getValue();
System.out.println("4 wgID: " + wgID);
//counting down the cdl so the cdl.await() can go on
cdl.countDown();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
System.out.println("2");
fref.child("WG").child("FlatNumber").addListenerForSingleValueEvent(listener);
System.out.println("5");
try{
cdl.await();
}
catch(Exception e)
{
System.out.println(e.toString());
}
System.out.println("6 wgID: " +wgID);
return 0;
したがって、CountdownLatch を使用しない場合は、次のようにSystem.out.println
なります。
I/System.out: 1
I/System.out: 2
I/System.out: 5
I/System.out: 6 wgID: null
I/System.out: 7
I/System.out: 3
I/System.out: 4 wgID: 1
私が見ているように、リスナーはメソッドの準備が整った後に実行されます。
CountDownLatch を使用すると、「cdl.await()」になるまで実行されてから停止し、リスナーは実行されず、アプリは停止します。
では、ID を取得するにはどうすればよいですか。つまり、データベースから 1 つの値だけが必要です。「setValue()」で設定できますが、「getValue」などで読み取ることはできません。リスナーで行う必要がありますか?