Firebase Firestore 同步/不带回调地检索数据

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

目前用于查询的代码如下所示:

FirebaseFirestore.getInstance().collection("someCollection").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @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,在那里它非常微不足道。


答案 1

您可以同步加载数据,因为 a 会返回 .因此,您可以等待该任务。DocumentReference.get()Task

如果我做这样的事情:

    val task: Task<DocumentSnapshot> = docRef.get()

然后我可以等待它完成

val snap: DocumentSnapshot = Tasks.await(task)

当在 get() 之后将其他操作与延续一起进行管道连接时,这很有用,这可能需要一些时间:

val task: Task = docRef.get().continueWith(executor, continuation)

上面,我正在一个单独的执行器上运行一个延续,我可以等待它全部完成。Tasks.await(task)

查看 https://developers.google.com/android/guides/tasks

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

还有另一种使用事务同步运行的方法。请参阅此问题。


答案 2

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

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

背景线程是...

public class RunInBackground extends AsyncTask {

  @Override
  protected Object doInBackground(Object[] objects) {

    Task<DocumentSnapshot> 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;
  }
}

推荐