Как следует из названия, я абсолютно не понимаю, почему слушатель не стреляет. Вот соответствующий код:
Log.i(Reference.LOG_TAG, "Loading menu from firebase");
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<List<Category>> output = new AtomicReference<>();
// this line does not fix the issue
// menuBaseRef.keepSynced(true);
menuBaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.d(Reference.LOG_TAG, "Invoking onDataChange for menu loading");
List<Category> categories = new ArrayList<>();
// irrelevant, code to load categories
Log.i(Reference.LOG_TAG, "Done loading, releasing latch");
output.set(categories);
latch.countDown();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e(Reference.LOG_TAG, "Error loading menu \"" + databaseError.toString() + "\"");
latch.countDown();
}
});
try {
Log.i(Reference.LOG_TAG, "Latching while menu loads");
latch.await(); // this makes the listener not fire
Log.i(Reference.LOG_TAG, "Menu latch released");
return output.get();
} catch (InterruptedException e) {
Log.e(Reference.LOG_TAG, "Latch interrupted while waiting for menu to load");
return null;
}
Запуск этого кода как есть приведет к тому, что latch.await()
никогда не завершится. Последнее сообщение, опубликованное в журнале: «Блокировка при загрузке меню», а «Вызов onDataChange для загрузки меню» нигде не видно.
Как только я удаляю latch.await()
, сообщение «Invoking onDataChange для загрузки меню» печатается, как и ожидалось.
Я пытался menuBaseRef.keepSynced(true)
, но это ничего не делает.
Любое понимание того, почему это происходит, будет оценено.