【问题标题】:Firebase Firestore retrieve data Synchronously/without callbacksFirebase Firestore 同步/无回调检索数据
【发布时间】:2018-04-04 09:36:19
【问题描述】:

我在我的 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 工作过,那里很简单。

【问题讨论】:

  • 如果我理解正确,您可能不得不取消您在onStoponPause 开始的请求。
  • 并非如此。我添加了一些代码来说明。
  • 您可以使用EventListener 并使用一些自定义类来实现它,然后使用onEvent() 触发您想要的内容
  • EventListener 会触发异步操作,我特意问有没有办法避免这种情况。

标签: java android firebase google-cloud-firestore


【解决方案1】:

您可以同步加载数据,因为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.

【讨论】:

  • 我错过了,谢谢。由于我的答案不再相关,因此我将其删除。
【解决方案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;
  }
}

【讨论】:

  • 我昨天测试了这个,但它没有停止代码执行或使其同步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2020-03-21
  • 2021-03-27
  • 2022-01-12
  • 2017-01-11
相关资源
最近更新 更多