addListenerForSingleValueEvent onDataChange не запускается при использовании CountDownLatch.await () - PullRequest
0 голосов
/ 23 апреля 2019

Как следует из названия, я абсолютно не понимаю, почему слушатель не стреляет. Вот соответствующий код:

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), но это ничего не делает.

Любое понимание того, почему это происходит, будет оценено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...