【问题标题】:Is there a way to do an adapter like class for firestore有没有办法为firestore做一个类似类的适配器
【发布时间】:2020-06-23 14:42:47
【问题描述】:

为了在线支持,我目前正在将数据存储到我的应用程序中的方式从 sqlite 切换到 Firestore。即使这是一个很大的飞跃,也意味着我当前的架构会发生很多变化。我想知道是否有一种方法可以模拟适配器类(例如用于 SQlite 的类),因此我可以通过至少重新使用我的方法名称和返回类型并避免显式编写来使这些更改保持最小每个文档在我需要的地方读/写。

我最初在所谓的“类适配器类”中尝试的是将文档数据加载到“适配器类”构造函数中的专用对象中。但它显然不起作用,因为 Firebase 查询是异步的,就像这里解释的那样:

Is there a way to write this database call into a function easily?

我想做的事可能吗?还是我注定要重做所有事情?

【问题讨论】:

    标签: java android google-cloud-firestore


    【解决方案1】:

    简短回答:是的,但你不应该

    如果你绝对必须:

    可以使用 CountDownLatch 将异步调用封装在 Firebase API 中,以创建您自己的 Future 实现。 Future is a Java Interface 类似于 Promises in JavaScript,它允许您传递异步计算的“未来结果”,直到您绝对需要它。

    查看this StackOverflow answer 以获取示例实现。

    然后,您将使用此包装器实现您的“类适配器类”,它将返回 Future,而您的类中的方法将返回 future.get()。此调用阻塞执行它的线程,当Future 解析时,调用计算为Future 中包含的值(“解包”它)。

    这就是你不应该这样做的原因:

    • 在 Android 中,阻塞 UI 线程通常是一个非常糟糕的主意,因此如果您当前的 Adapter 已经是同步调用,它将一直阻塞直到 Firebase 查询完成。
    • 如果您已经使用 SQLite 查询阻塞了 UI 线程,并且认为您可能因此没问题,请考虑现在这不是问题的可能性,只是因为 SQLite 查询太很快就重要了。当您切换到 Firestore 时,查询平均可能需要更长的时间,并且由于不同的网络条件等原因,它们的响应时间方式差异更大。
    • 如果考虑重构以使用异步 API 不是很不可行,请认真考虑。您的查询现在需要更长的时间,并且您可能无论如何都需要“加载”指标,因此使用异步 API 将对此有所帮助。当您需要同时运行查询但它们不相互依赖时,您可能还会看到并行运行查询的机会,并且保持异步允许您这样做。
      • 如果查询足够快以至于顺序与并行无关紧要,这在以前可能无关紧要,但现在可能。

    【讨论】:

    • 感谢您的回答,确实我正在使用 SQLite 阻塞 UI 线程,而网络是我现在应该考虑的事情。我现在考虑在线程或服务中放置不同的 SnapshotListener(我目前只需要获取没有显式查询的文档)。这是一个好的解决方案吗?
    • 这通常不是必需的,因为 API 是异步的 - 您可以在 UI 线程中创建侦听器并且它不会阻塞,只需在有新数据或其他相关事件时调用回调即可。这是异步 API 的主要优点 - 它在等待时不会阻塞,即使是单线程。
    • 另外,@CromSoldier,如果这个或任何答案已经解决了您的问题,请点击复选标记考虑accepting it。没有义务这样做,但它向更广泛的社区表明您已经找到了解决方案,并向回答者和您自己提供了一些 reputation :)。
    • 好的,那么我将在我的代码中使用异步 API,也许我想“太懒惰”。感谢您的帮助。
    • 我只是想澄清一下 SnapshotListener “异步 API”的一部分,所以如果你要使用它,在另一个线程中使用它是额外的工作,首先使用它通常不会带来更多好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2019-12-04
    • 2022-09-16
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多