从 Java 调用 Kotlin 挂起函数

Call a Kotlin suspend function from Java

我有一个 Kotlin 库,我正试图从 Java 调用它。我之前没有使用过 Kotlin。

Kotlin库函数如下:

suspend fun decode(jwt: String): UsefulThing {
    // does a bunch of stuff, removed for brevity.
    return otherthing.getUsefulThing(jwt)
}

如何从 Java 调用它?到目前为止我已经尝试过:

Continuation<UsefulThing> continuation = new Continuation<>() {

    @NotNull
    @Override
    public CoroutineContext getContext() {
        return EmptyCoroutineContext.INSTANCE;
    }

    @Override
    public void resumeWith(@NotNull Object o) {
        System.out.println("Result of decode is " + o);
    }

};

// Call decode with the parameter and continuation.
Object result = UsefulThingKt.decode(JWT, continuation);

// result is COROUTINE_SUSPENDED

我从来没有看到任何控制台输出。看起来延续从未被调用,或者它在另一个上下文中是 运行 。我仔细研究了其他答案,协程似乎经历了多次迭代 - 我找不到对我来说真正有意义的解释。

我要注意我 运行 宁 Java 11.

如何简单调用kotlin函数?

我建议甚至不要尝试。挂起函数从未用于 Java 互操作。

相反,在 Kotlin 端将其转换为 Java 可以理解的内容 - 转换为 CompletableFuture:

fun decodeAsync(jwt: String): CompletableFuture<UsefulThing> = GlobalScope.future { decode(jwt) }

我们可以在单个模块中自由混合 Java 和 Kotlin 代码,因此您可以在项目中创建这样的包装器。

根据您的情况,您可以使用 GlobalScope(在 Java 中我们没有结构化并发),或者您可以创建自定义 CoroutineScope 并手动处理其生命周期。