首页 > 解决方案 > 等到检索到 Firestore 数据

问题描述

我需要在内部 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;

    }

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


由于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);

推荐阅读