首页 > 解决方案 > Android 开发中的协同例程是否仅适用于 Kotlin?使用 MVVM 从 android 房间检索,让 id 立即返回活动的方法?

问题描述

这是关于 android 开发和使用协程的一般问题。我对在 android 中开发相对较新,并且使用 MVVM 架构模型创建了一个应用程序。

我目前遇到问题,我插入表并使用 LiveData 在观察者中检索 ID。然后我需要立即使用此 ID 插入另一个表以充当外键。一个表定义条目,另一个表定义与该条目关联的字段。

我的问题是初始 ID 的插入是在后台发生的,所以当 ID 返回到活动时,已经抛出了一个错误。

我需要一些方法:

我见过一种解决方案是使用协同程序,但这似乎只是一个 Kotlin 解决方案。

有谁知道可以在 android java 中立即检索活动中插入的 ID 以用于下一次插入的解决方案?

*我正在使用房间 SQL 数据库。

标签: javaandroidkotlin

解决方案


好的,如果我错了,请纠正我,但我认为您想要的是一种以同步方式将异步操作链接在一起的方法。

因此,您有一个操作需要异步插入到表中,而另一个操作需要使用第一个操作结果中的 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();
    });
}

推荐阅读