Подождите, пока данные Firestore будут получены - PullRequest
0 голосов
/ 28 сентября 2019

Мне нужно после завершения внутреннего foreach и добавить все данные в список, а затем отправить в интерфейс

, но когда эта строка "view.setOrders (orderList);" ниже "orderList.add (order); "

мой код работает нормально, но это не производительность, мне нужен лучший способ сбора списка, а затем отправить на интерфейс ..

public ListenerRegistration getOrders() {

        view.showLoading();

       ListenerRegistration listenerRegistration = refOrders.addSnapshotListener((queryDocumentSnapshots, e) -> {

            view.hideLoading();

            if (e != null) {
                view.onErrorMessage(e.getMessage());
            } else {
                List<Order> orderList = new ArrayList<>();
                for (QueryDocumentSnapshot snapshot : queryDocumentSnapshots) {

                    Order order = snapshot.toObject(Order.class);
                    order.setOrderId(snapshot.getId());

                    refUsers.document(order.getPhone()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<DocumentSnapshot> task) {

                            if (task.isSuccessful()) {
                                User user = task.getResult().toObject(User.class);
                                order.setName(user.getName());
                                order.setAddress(user.getAddress());
                                orderList.add(order);

                            }


                        }
                    });
                }

                //Here Back List size = 0
                view.setOrders(orderList);


            }
        });

       return listenerRegistration;

    }

1 Ответ

0 голосов
/ 28 сентября 2019

Поскольку метод get() является асинхронным, это означает, что код после CompletionListener будет выполняться сначала , а затем после получения данных будет выполняться listener.

Поэтому, чтобы решить проблему, добавьте следующую строку view.setOrders(orderList); внутри CompletionListener

if (task.isSuccessful()) {
 User user = task.getResult().toObject(User.class); 
 order.setName(user.getName());
 order.setAddress(user.getAddress());
 orderList.add(order);
view.setOrders(orderList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...