Java асинхронное обновление из Eventlistener Firebase - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть часть кода, которая обновляет переменную по возвращению запроса Firebase. За пределами этого раздела я ссылаюсь на эту переменную и печатаю ее.

Однако, похоже, что она выполняется как асинхронная операция и выводит переменную до того, как в нее будут введены какие-либо значения, поэтому я продолжаю получать null. Есть ли on complete для addListenerForSingleValueEvent?

public Map<String, String> childKV;
public Map<String, Object> allChildren;
public getChild() {
    allChildren = new HashMap<>();
    DatabaseReference dbRef = fb.child("inventory");
    ValueEventListener listener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot childSnap : snapshot.getChildren() {
                childKV = new HashMap<>();
                childKV.put(
                    childSnap.getKey(),childSnap.getValue()
                );
                allChildren.put(childSnap.getKey(), childKV);
            }
        }
        @Override
        ...
    };
    dbRef.orderByKey().addListenerForSingleValueEvent(listener);
    dbRef.removeEventListener(listener);
    printChildren(allChildren);
}
public void printChildren(Map<String,Object>) {...}

Edit:

Как и Обновить значение переменной из запроса Firebase? , но для Java. Значит ли это, что я должен использовать отражение?

1 Ответ

0 голосов
/ 08 ноября 2018

Действительно, eventListeners ведут себя асинхронно, и, таким образом, вы правильно поняли свою проблему.

К сожалению, у меня есть решение, что вам, возможно, придется изменить свой подход из-за этого Таким образом, вы должны пойти на подход, ориентированный на события. Следовательно, вместо того, чтобы «ждать поступления данных и затем делать свое дело», я бы «когда данные поступают, делаю свое дело».

В зависимости от вашей проблемы, напечатайте значение в методе onDataChange() вашего singleValueEventListener, это будет гарантировать, что вы не получите нулевое значение, а также вы получите правильное значение.

Кроме этого, еще один подход, который я нашел, когда искал, это Task.await(). Я не буду рассчитывать на это, но вы можете прочитать об этом здесь:

StackOverflow Вопрос

StackOverflow Ответ

...