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

Pat*_*ild 2 java android android-asynctask firebase google-cloud-firestore

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

不知何故,我试图实现的是:

Task t1 = Query1.get().onSuccesListener.... ; 
Task t2 = Query2.get().onSuccesListener.... ; 
Task t3 = Query3.get().onSuccesListener.... ; 
Task t4 = Query4.get().onSuccesListener.... ; 
Run Code Online (Sandbox Code Playgroud)

我无论如何都找不到Task在 Android 中使用它们的方法,因此我尝试在 a 中运行查询AsynTask,然后AsyncTask使用 Latch等待所有操作完成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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

任何想法如何在我加载框架之前并行运行所有 4 个线程并等待它们完成?

Ale*_*amo 6

您可以使用 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
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Shudy要跟踪失败,除了`onSuccess()`之外,您还应该实现`onFailure()`。这样,您就可以知道您的读取操作发生了什么。 (2认同)