1

コードに次の構造があります

public boolean do(){
    final boolean[] returnValue = new boolean[1];
    final CountDownLatch cdl = new CountDownLatch(1);

    event.addListener(new Listener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d(TAG, "onDataChange");
            returnValue[0] = true;
            cdl.countDown();
        }
    });


    try {
        if (cdl.await(1L, TimeUnit.MINUTES)) { 
            return returnValue[0];
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return false;
}

何が起こるかというと、CountDownLatch1 分間待機してからリスナーがトリガーされます。ただし、ラッチはすでにカウントダウンされているため、false常に返されます。私には、ラッチがスレッド全体をブロックしていて、非同期コールバックが発生しないように見えます。event.addListener()...パーツを でラップしようとしましたRunnableが、問題は解決しません。

コードの別の部分にまったく同じ構成があり、そこで機能します。

編集:ログを入れましThread.currentThread().getId()たが、実際には同じIDに評価されます。非同期コールバックは別のスレッドにあるべきではありませんか?

4

0 に答える 0