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

时间:2017-10-23 18:28:11

标签: java android firebase google-cloud-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,而且那里非常简单。

2 个答案:

答案 0 :(得分:11)

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

如果我这样做:

    val task: Task<DocumentSnapshot> = 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专门检查这种情况并抛出异常。

还有另一种使用事务同步运行的方法。 见this question.

答案 1 :(得分:0)

您可以在主线程 ...

上执行此类操作
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;
  }
}