如何在 Java 中恢复 Kotlin Coroutine Continuation
How to resume a Kotlin Coroutine Continuation in Java
我正在将 Kotlin 代码添加到 Java 项目中。我用 suspendCancellableCoroutine
创建了一个 Kotlin 挂起函数
suspend fun someSuspendFunction = suspendCancellableCoroutine<Boolean>{ continuation ->
someJavaObject.someSuspendFunctionContinuation = continuation
}
我需要 someSuspendFunction
通过 someJavaObject
中完成的一些逻辑来恢复,所以我在 someJavaObject
中声明了一个字段来存储后续使用。
CancellableContinuation<Boolean> someSuspendFunctionContinuation;
但是,当我想恢复它时,我找不到合适的方法来调用。在 Kotlin 中,我可以简单地调用 continuation.resume(true)
。我查看了 resume()
的定义,发现它叫做 resumeWith(Result.success(value))
。所以我试着把这个写在 Java:
someSuspendFunctionContinuation.resumeWith(Result.Companion.success(true))
这给出了这个错误:'success(java.lang.Boolean)' has private access in 'kotlin.Result.Companion'
所以我尝试直接构造Result
someSuspendFunctionContinuation.resumeWith(new Result(true));
这给了我:Expected 0 arguments but found 1
是否可以构造一个 Result
具有价值以在 Java 中重新使用协程延续?
您可以使用反射创建 Result
对象:
public void resume() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
var successMethod = Result.Companion.getClass().getDeclaredMethod("success", Object.class);
successMethod.setAccessible(true);
someSuspendFunctionContinuation.resumeWith(successMethod.invoke(Result.Companion, true));
}
但我认为最好自己在 Kotlin 中创建一个非常小的实用程序以便在 Java 中使用它:
fun <T> resumeContinuationWithSuccess(cont: Continuation<T>, value: T) {
cont.resumeWith(Result.success(value))
}
public void resume() {
SuspendUtils.resumeContinuationWithSuccess(someSuspendFunctionContinuation, true);
}
我正在将 Kotlin 代码添加到 Java 项目中。我用 suspendCancellableCoroutine
suspend fun someSuspendFunction = suspendCancellableCoroutine<Boolean>{ continuation ->
someJavaObject.someSuspendFunctionContinuation = continuation
}
我需要 someSuspendFunction
通过 someJavaObject
中完成的一些逻辑来恢复,所以我在 someJavaObject
中声明了一个字段来存储后续使用。
CancellableContinuation<Boolean> someSuspendFunctionContinuation;
但是,当我想恢复它时,我找不到合适的方法来调用。在 Kotlin 中,我可以简单地调用 continuation.resume(true)
。我查看了 resume()
的定义,发现它叫做 resumeWith(Result.success(value))
。所以我试着把这个写在 Java:
someSuspendFunctionContinuation.resumeWith(Result.Companion.success(true))
这给出了这个错误:'success(java.lang.Boolean)' has private access in 'kotlin.Result.Companion'
所以我尝试直接构造Result
someSuspendFunctionContinuation.resumeWith(new Result(true));
这给了我:Expected 0 arguments but found 1
是否可以构造一个 Result
具有价值以在 Java 中重新使用协程延续?
您可以使用反射创建 Result
对象:
public void resume() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
var successMethod = Result.Companion.getClass().getDeclaredMethod("success", Object.class);
successMethod.setAccessible(true);
someSuspendFunctionContinuation.resumeWith(successMethod.invoke(Result.Companion, true));
}
但我认为最好自己在 Kotlin 中创建一个非常小的实用程序以便在 Java 中使用它:
fun <T> resumeContinuationWithSuccess(cont: Continuation<T>, value: T) {
cont.resumeWith(Result.success(value))
}
public void resume() {
SuspendUtils.resumeContinuationWithSuccess(someSuspendFunctionContinuation, true);
}