当前位置: 首页 > 知识库问答 >
问题:

如何从Java 7调用Kotlin挂起协程函数

徐昕
2023-03-14

我正在尝试从 Java 7 调用科特林函数。我正在使用协程,这个被调用的函数正在挂起,例如:

suspend fun suspendingFunction(): Boolean {
    return async { longRunningFunction() }.await()
}

suspend fun longRunningFunction() : Boolean {
    delay(400)
    return true
}

我在版本 0.25.3 中使用了协程,我可以通过传递继续来模拟简单的 Java 回调样式

CoroutinesKt.suspendingFunction(new Continuation<Boolean>() {
    @Override
    public CoroutineContext getContext() {
        return EmptyCoroutineContext.INSTANCE;
    }

    @Override
    public void resume(Boolean value) {
        doSomethingWithResult(value);
    }

    @Override
    public void resumeWithException(@NotNull Throwable throwable) {
        handleException(throwable);
    }
});

但是,在更新到完全稳定的1.0.1版本之后,我认为这不再可能。假设暂停函数的更新版本如下所示:

suspend fun suspendingFunction(): Boolean {
    return GlobalScope.async { longRunningFunction() }.await()
}

<代码>续

我知道通常建议将coroutine转换为< code>CompletableFuture,但是我使用的是Android,这意味着只使用Java 7。另一方面,简单的< code>Future太愚蠢了,因为我不想定期检查函数是否完成——我只想在函数完成时被调用。我真的希望避免添加新的库或许多额外的类/方法。

有没有简单的方法可以直接从Java7调用挂起函数?

由于静态编程语言试图与Java非常可互操作,我想会有一些简单的方法来做到这一点,但我还没有找到。

共有2个答案

张翰海
2023-03-14

可以使用BuildersKt。这已经包含在< code >实现" org . jetbrains . kot linx:kot linx-coroutines-core:1 . 5 . 0 " 中

    BuildersKt.launch(
            GlobalScope.INSTANCE,
            (CoroutineContext) Dispatchers.getMain(),
            CoroutineStart.DEFAULT,
            (Function2<CoroutineScope, Continuation<? super Unit>, Unit>) (coroutineScope, continuation) -> {
                // your code here
                return Unit.INSTANCE;
            }
    );
江德润
2023-03-14

根据您的环境,您有多个选项。

    < li >如果在项目中使用< code>rxJava2,模块< code > kot linx-coroutines-rx2 具有在coro utines和Rx数据类型之间来回转换的实用函数。

实例

suspend fun sayHello(): String {
    delay(1000)
    return "Hi there"
}

fun sayHelloSingle(): Single<String> = GlobalScope.rxSingle { sayHello() }

示例(科特林一侧)

abstract class Continuation<in T> : kotlin.coroutines.Continuation<T> {
    abstract fun resume(value: T)
    abstract fun resumeWithException(exception: Throwable)
    override fun resumeWith(result: Result<T>) = result.fold(::resume, ::resumeWithException)
}   

示例(Java侧)

sayHello(new Continuation<String>() {
    @Override
    public CoroutineContext getContext() {
        return EmptyCoroutineContext.INSTANCE;
    }

    @Override
    public void resume(String value) {
        doSomethingWithResult(value);
    }

    @Override
    public void resumeWithException(@NotNull Throwable throwable) {
        doSomethingWithError(throwable);
    }
});
 类似资料:
  • 我们使用夸克斯来处理在常规函数上运行的消息,因为我们基本上必须调用函数 我们希望以Uni的形式获取数据(https://smallrye.io/smallrye-mutiny/getting-started/creating-unis)所以基本上我们想回去 我们需要进一步下游的uni一次来处理一些数据,但我们想从方法含义返回

  • 我正在阅读Kotlin Coroutine并且知道它是基于函数的。但是是什么意思呢? Coroutine或函数挂起? 摘自https://kotlinlang.org/docs/reference/coroutines.html 哪一个被停职了? 摘自https://kotlinlang.org/docs/reference/coroutines.html 为了继续类比,await()可以是一个挂

  • 这段代码适用于Java。但是在迁移到Kotlin之后,编译器higlits方法出现以下文本错误: Andswer是: 如果希望在另一个类中使用这个本机函数,可以指定包含它的类,如下所示:

  • 我正在尝试理解kotlin协程,我来自C#,在kotlin中有一些我不理解的地方。在这种情况下,我正在使用Qukus框架中的静态编程语言编写一个webapi。从我可以看出,如果我将控制器(或资源)函数标记为挂起函数,Qukus将自动在协程中启动它。 我的问题是,我不知道挂起该协程的首选方法是什么。我在kotlin协程上看到的绝大多数示例都使用delay()函数,该函数在内部使用suspendCan

  • 这里checkNetwork是挂起函数。在执行它之前,返回值被传递给调用方(视图/活动)。如果不将“ISNetworkawable”作为挂起,我该如何实现?。 在checkNetwork方法中,检查可达性调用网络调用如下所示。 子方法是 重复我的问题,如果不将“ISNetwork可用”作为挂起,我该如何实现?。

  • 问题内容: Python版本:2.6.7 我在for循环中有以下subprocess.call,该循环被执行18次,但是,该过程始终挂在第19个循环上: 控制台输出如下所示: 由于我对python脚本不是很熟悉,所以我只是在徘徊我是否在做错什么…我怀疑某个地方出现了死锁。 会处理这些问题吗? 在什么情况下subprocess.call会挂起任何专家答案?非常感谢 问题答案: 当使用子过程时,我倾向