Firebase Firestore同步/无回调检索数据

我在我的Android应用程序中的一个单独的线程中使用Cloud Firestore,所以我不想使用侦听器OnSuccessListenerOnFailureListener在另一个线程中运行。 我可以让我的线程等待结果(并在需要时捕获任何exception)吗?

目前查询的代码是这样的:

 FirebaseFirestore.getInstance().collection("someCollection").get().addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(QuerySnapshot documentSnapshots) { // do something on the UI thread with the retrieved data } }); 

我想要的是:

 FirebaseFirestore.getInstance().collection("someCollection").getAndWaitForResult(); //Block the thread and wait for result, no callbacks. //getAndWaitForResult() is not a real function, just something to describe my intention. 

我之前曾经使用过Parse Server,在那里它非常简单。

您可以同步加载数据,因为DocumentReference.get()返回一个Task 。 所以你可以等待那个任务。

如果我这样做:

  val task: Task = docRef.get() 

然后我可以等待它完成

 val snap: DocumentSnapshot = Tasks.await(task) 

当在get()之后将其他操作连接在一起时,这可能需要一段时间,这很有用:

val任务:Task = docRef.get()。continueWith(executor,continuation)

上面,我在一个单独的执行器上运行一个延续,我可以等待所有这些完成Tasks.await(task)

请参阅https://developers.google.com/android/guides/tasks

注意:您不能在主线程上调用Tasks.await()。 Tasks API专门检查此情况并将引发exception。

还有另一种使用事务同步运行的方法。 看到这个问题。

你可以在主线程上做这样的事……

 YourObject yourObject = (YourObject)new RunInBackground(). execute("someCollection","someDocument").get() 

背景线程是……

 public class RunInBackground extends AsyncTask { @Override protected Object doInBackground(Object[] objects) { Task documentSnapshotTask = FirebaseFirestore.getInstance(). collection((String) objects[0]).document((String) objects[1]).get(); YourObject obj=null; try { DocumentSnapshot documentSnapshot = Tasks.await(documentSnapshotTask); obj = new YourObject(); obj.setter(documentSnapshot.get("your field")); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return obj; } }