从 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
并手动处理其生命周期。
我有一个 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
并手动处理其生命周期。