在折射应用程序时,我决定使用房间(以及其他架构组件)。一切顺利,直到我到达数据库查询,这是异步。我很好,我可以使用LiveData回调更新视图。
但是问题出现在较小的查询之后 - 没有线程限制很容易,你可以直接使用变量。
在遗留代码中有很多设置,其中从不同的表中一个接一个地需要相当多的小数据。例如,查询一个表中是否存在项目,一些计算,查询另一个表等等。
禁用查询的异步要求不是一种选择,我更喜欢按预期使用Room。
首先想到的是嵌套回调,但它太难看了。 第二个想法是查询所有必需的数据,仅在收到所有回调后启动方法。它听起来也不太好,有些情况下一个回调函数需要另一个查询所需的数据。
奇怪的是,我没有找到任何相关的论坛帖子或文章来处理这个问题。 有没有人处理过它?有什么想法吗?
答案 0 :(得分:2)
大多数@Dao
方法是同步的,在你调用它们的任何线程上返回它们的结果。例外是具有被动返回类型的@Query
方法,例如Maybe<List<Goal>>
或LiveData<List<Goal>>
,其中方法返回被动类型,结果以异步方式传递给订阅者。
因此,对于您有更复杂的业务逻辑的情况,您有三个主要的行动方案(我现在可以想到):
使用RxJava并尝试将所有业务逻辑压缩到可观察链中。有很多RxJava运算符,因此map()
,flatMap()
,switchMap()
,weAreLostWhereDidWePutTheMap()
等的某些组合可能就足够了。
在后台线程上进行工作,由LiveData
子类调解,以便消费者可以订阅LiveData
。
使用经典线程选项(例如IntentService
)或更多现代替代品(例如JobIntentService
)。