java - 等到检索到 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;
}
解决方案
由于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);
推荐阅读
- angular - Angular6 消息传递应用程序
- android - 在 react-native 项目中找不到 metro-config node_modules
- maven - 在 pom.xml 中使用什么 maven 插件进行自动化测试 testNG、java、rest-assured 框架?
- c - 如何转换字符数组中的浮点值
- c++ - 为什么这个模板函数的行为不像预期的那样?
- java - Java 日期转换格式
- docx - 在 Midnight Commander 中查看 MS Word .docx 文件
- mongodb - 如何使用 Mongdb 按选定属性(嵌套)计算对象数
- android - Android GeoCoder 服务不可用错误
- sonarqube - 提取 sonar-scanner-api-batch.jar 失败:该进程无法访问该文件,因为它正被另一个进程使用