【问题标题】:Retrieve data synchronously from firestore database从 Firestore 数据库同步检索数据
【发布时间】:2021-12-29 13:22:15
【问题描述】:

您如何以List 的形式获取数据库根目录中存在的集合的大小。

get().getResult().size() 方法不起作用,它正在抛出 IllegalStateException:“任务尚未完成”。

并且不能在循环中使用异步/回调方法将其值添加到列表中然后返回。

【问题讨论】:

  • 您是否有理由不将此尺寸测量放在它自己的线程中,而只是使用.then() 来等待.get() 的结果?
  • @fabc .then() 不是任何方法。另外,也无济于事。目标是阻塞线程直到它获取结果。
  • .then() 是一种方法,但是?对不起,任务使用监听器(虽然then() 确实存在用于任务,但它在Continuation.then(Task) 中使用)。就像我说的......为什么不把它放在自己的线程中?阻塞主线程会冻结你的应用程序(至少从用户的角度来看,他们认为它很可能崩溃了)。
  • @fabc 如果它阻塞线程,我会将其放入后台线程。但在这里,它是异步的,不等待响应。我希望它在继续循环之前等待响应。
  • 为集合设置一个临时值并在收到响应后更新它不是更好吗?否则,在整个循环完成之前,您将无法加载任何内容,这可能需要几秒钟到一分钟。另外,也许它是 cmets 的格式,但是,如果我理解正确,您没有将它放在后台线程中,因为它是异步的,但是您想让它同步,所以您将它放在自己的线程中?另外,不需要包含我的标签,我会根据问题进行适当的回复。

标签: android firebase asynchronous google-cloud-firestore


【解决方案1】:

考虑一个场景。

有一个“n”号。数据库根目录中的集合,并且它们的名称在列表中。您必须获取每个集合的size()(其中的文档数)。通过同步调用获得此信息的唯一方法是等到挂起的请求完成。你可以这样实现:

 private void syncDocumentCounts() {
     if (position > names.size() - 1) {
         adapter.notifyDataSetChanged();
     } else {
         FirebaseFirestore.getInstance().collection(names.get(position)).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
             @Override
             public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                 list.add(queryDocumentSnapshots.size());
                 position++;
                 syncDocumentCounts();
             }
         });
     }
 }

这里,

position = public int = 0

names = 集合名称列表

list 是我们必须在其中添加值的列表。

【讨论】:

  • 这段代码没有同步。 get() 始终是异步的并立即返回一个任务,并且任务侦听器回调始终在查询完成后的某个时间被调用,但不保证需要多长时间。我也很不清楚为什么回调需要第二次调用syncDocumentCounts。
  • @DougStevenson 是的,我知道。但是通过这种方式,我们可以等待第二次调用,直到第一次调用完成。此外,这将按顺序逐一检索数据。回调需要调用syncDocumentCounts,因为我们必须遍历许多集合。我们需要获取根中每个集合的大小。你不觉得firebase应该提供一个同步方法阻塞线程直到它返回响应
  • 所有 Firebase API 都不是同步的,而且永远不会同步。 Android 应用程序阻塞主线程是非常糟糕的。要求应用程序开发人员应用适当的异步编程技术,通常使用由 Jetpack (LiveData) 或 Kotlin 协程建立的架构模式。
  • @DougStevenson 我同意。它可以使用实时数据或任何其他架构模式来完成,但提供一种方法不会花费 firebase 任何费用。相反,它将提供一种体验。
  • 实施、测试、维护需要付出努力,而且开发人员不了解如何正确使用它会导致他们的应用程序冻结甚至无法预料的 ANR。这使得 Firebase SDK 看起来很糟糕。它只是不会发生。这是 6 年前的有意设计决定,不会改变。
猜你喜欢
  • 2018-04-04
  • 2021-10-26
  • 2020-12-18
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2019-05-03
  • 2019-09-24
  • 2021-06-16
相关资源
最近更新 更多