java - Android 开发中的协同例程是否仅适用于 Kotlin?使用 MVVM 从 android 房间检索,让 id 立即返回活动的方法?
问题描述
这是关于 android 开发和使用协程的一般问题。我对在 android 中开发相对较新,并且使用 MVVM 架构模型创建了一个应用程序。
我目前遇到问题,我插入表并使用 LiveData 在观察者中检索 ID。然后我需要立即使用此 ID 插入另一个表以充当外键。一个表定义条目,另一个表定义与该条目关联的字段。
我的问题是初始 ID 的插入是在后台发生的,所以当 ID 返回到活动时,已经抛出了一个错误。
我需要一些方法:
- 要么等待返回ID
- 或者让插入在前台运行(但我不确定如何执行此操作)。
我见过一种解决方案是使用协同程序,但这似乎只是一个 Kotlin 解决方案。
有谁知道可以在 android java 中立即检索活动中插入的 ID 以用于下一次插入的解决方案?
*我正在使用房间 SQL 数据库。
解决方案
好的,如果我错了,请纠正我,但我认为您想要的是一种以同步方式将异步操作链接在一起的方法。
因此,您有一个操作需要异步插入到表中,而另一个操作需要使用第一个操作结果中的 id 插入到另一个表中。
因此,您的第二个操作需要第一个操作在运行之前完成。但是您的第一个操作是在后台运行的,所以问题出现了;“我如何确保在第一个操作完成之前不触发第二个操作?”。
这是“链接”异步调用的概念。或者,换句话说,以同步方式执行异步调用。
因为您需要使用 Java,所以您将无法使用 Kotlin 协程(因为这是 Kotlin 语言的特性)。幸运的是,有几种方法可以在 Java 中实现这一点。
我个人会推荐使用 RX Java。有很多运算符用于组合异步操作。对于这个用例,您可能想要的那个叫做flatMap
,它是一个在调用第二个操作之前阻塞第一个操作结果的运算符,第一个操作的结果作为参数。
然而,RX 是一个相当大的依赖项,并且有相当长的学习曲线。因此,选择使用此工具将取决于此类问题在您的代码库中的普遍程度。
另一种选择是设置一个共享的单线程执行程序,用于在同一个后台线程上发出两个操作。因为它是一个单一的后台线程,只要你按顺序向执行器发出命令,它们就会按顺序执行,但是在后台线程上。所以,假设你的 Room DB 函数是阻塞的(即当你发出它们时,当前线程等待操作完成),那么你可以有一个像这样的链式操作:
// Create a shared single threaded executor to run both operations on the same background thread
private Executor sharedSingleThreadExecutor = Executors.newSingleThreadExecutor();
private void doThingAThenThingB() {
// Sequentially call thing A on shared background thread
sharedSingleThreadExecutor.execute(() -> {
// Do thing A
doThingA();
});
// Sequentially call thing B on shared background thread
sharedSingleThreadExecutor.execute(() -> {
// Do thing b
doThingB();
});
}
推荐阅读
- java - 正则表达式:捕获多个正则表达式组合的否定
- excel - 从最新文件中提取文件名
- waf - 基于特征的一个输入的多个输出
- tensorflow - 对于从命令行工作的同一模型,tensorflow-serving 给了我一个“被喂入和获取”错误
- python - 我正在读入一个 256 字节的字符串。我想跳过它,如果都是二进制零 (\x00) 是否有一个测试?
- ios13 - iOS 13 beta 中的 UIMenuController 显示为透明背景而不是黑色背景
- windows - 从 Powershell 执行 cmd.exe 命令并传递参数
- javascript - 将对象作为参数传递给javascript中的处理函数时,为什么我不能重新分配对象?
- xmlhttprequest - Internet Explorer 11 和 XMLHttp 响应中的 0xEF 0xBF 0xBF
- c# - 当手机倒置时,由加速度计控制的 Unity 平台旋转方向错误