1

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」などで読み取ることはできません。リスナーで行う必要がありますか?

4

1 に答える 1