コードに次の構造があります
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;
}
何が起こるかというと、CountDownLatch
1 分間待機してからリスナーがトリガーされます。ただし、ラッチはすでにカウントダウンされているため、false
常に返されます。私には、ラッチがスレッド全体をブロックしていて、非同期コールバックが発生しないように見えます。event.addListener()...
パーツを でラップしようとしましたRunnable
が、問題は解決しません。
コードの別の部分にまったく同じ構成があり、そこで機能します。
編集:ログを入れましThread.currentThread().getId()
たが、実際には同じIDに評価されます。非同期コールバックは別のスレッドにあるべきではありませんか?