【发布时间】:2019-04-26 10:16:07
【问题描述】:
在我的应用程序中,我想在开始片段之前对我的数据库执行 4 次查询。
不知何故,我试图实现的是:
Task t1 = Query1.get().onSuccesListener.... ;
Task t2 = Query2.get().onSuccesListener.... ;
Task t3 = Query3.get().onSuccesListener.... ;
Task t4 = Query4.get().onSuccesListener.... ;
我无论如何都找不到在 Android 中使用 Task 来执行它们,所以我尝试在 AsynTask 内运行查询,然后使用 Latch onPostExecuted 等待所有 AsyncTask 完成。
这里是我的 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 个线程并等待它们完成,然后再加载我的框架?
【问题讨论】:
-
如果您希望在文档或查询发生更改时收到通知,则只能使用侦听器。如果您只想一次获取文档或查询结果,请使用 get()。 Firestore 查询都是异步的,因此您无需使用 AsyncTask 添加任何线程。
标签: java android firebase android-asynctask google-cloud-firestore