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

时间:2019-04-26 10:16:07

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

在我的应用程序中,我想在开始片段之前对数据库执行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个线程中并行运行并等待它们完成后再加载frament吗?

1 个答案:

答案 0 :(得分:1)

您可以使用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()方法时,结果是从这些查询中获得的list个对象。

Cloud Firestore客户端已经在后台线程中运行所有网络操作。这意味着所有操作都在不阻塞主线程的情况下进行。将其放在AsyncTask中不会带来任何其他好处。

相关问题