java - 运行多个 Firestore 查询并等待所有查询完成

标签 java android firebase android-asynctask google-cloud-firestore

在我的应用程序中,我想在开始 fragment 之前对我的数据库执行 4 次查询。

我想以某种方式实现的是:

Task t1 = Query1.get().onSuccesListener.... ; 
Task t2 = Query2.get().onSuccesListener.... ; 
Task t3 = Query3.get().onSuccesListener.... ; 
Task t4 = Query4.get().onSuccesListener.... ; 

无论如何,我找不到在 Android 中使用 Task 来完成它们,所以我尝试在 AsynTask 中运行查询,然后等待所有 AsyncTask 通过使用闩锁 onPostExecuted 来完成。

这是我的一个带有查询的 AsyncTask 示例。

private class GetLandlordsRoomQuery extends AsyncTask<Void, Void, Void> {
        ArrayList<RoomPosted> landlordsRooms = new ArrayList<>();
        @Override
        protected Void doInBackground(Void... voids) {
            Query removeNonTenant = FirebaseFirestore.getInstance()
                    .collection(DataBasePath.ROOMS.getValue())
                    .whereEqualTo("landlordID", FirebaseAuth.getInstance().getUid());

            removeNonTenant.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    for (DocumentSnapshot d : queryDocumentSnapshots) {
                        landlordsRooms.add(d.toObject(RoomPosted.class));
                    }
                }
            });
            return null;
        }
        @Override
        public void onPostExecute(Void result) {
            mLandlordsRooms = landlordsRooms;
            if (--asyncTaskLatch == 0){
                startFragmentFromLandlord();
            }
        }
    }

我在这里运行的问题是 onPostExecuted 在查询完成之前运行。

我可能使用 AsyncTask 解决这个问题的方法是错误的,但是找不到使用 Task 等待所有 4 个任务完成而不用嵌套 onCompleteListener 的方法。

有什么想法可以并行运行所有 4 个线程并在加载框架之前等待它们完成吗?

最佳答案

您可以使用 Tasks 的 whenAllSuccess() 在本地简单地合并所有 4 个单独的查询方法。您可以使用以下代码行实现此目的:

Task t1 = Query1.get();
Task t2 = Query2.get();
Task t3 = Query3.get();
Task t4 = Query4.get();

Task combinedTask = Tasks.whenAllSuccess(t1, t2, t3, t4).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
         //Do what you need to do with your list
    }
});

如您所见,当覆盖 onSuccess() 方法时,结果是您从这些查询中获得的对象的列表

Cloud Firestore 客户端已在后台线程中运行所有网络操作。这意味着所有操作都不会阻塞您的主线程。将它放在 AsyncTask 中不会带来任何额外的好处。

关于java - 运行多个 Firestore 查询并等待所有查询完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865448/

相关文章:

java - 没有前端的 Google reCaptcha 测试

java - Google Ima SDK,播放声音但没有 View

android - 从 Intent 中获取所选文件的文件扩展名

android - Child 的 OnClickListener 防止 Android ViewPager 滑动

android - 将 Firebase 数据快照反序列化为 Kotlin 数据类

Java wordsearch 字符数组

java - 如何使用字节数组作为键对字符串进行异或?

android - 如何在带有参数和 header 的android Volley库中使用POST请求?

Firebase RTDB 在关键字列表中搜索关键字

ios - 如果我不将 iOS 应用从 Fabric Crashlytics 迁移到 Firebase