如何在Java中恢复Kotlin协程延续



我正在向Java项目添加Kotlin代码。我用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);
}

相关内容

  • 没有找到相关文章

最新更新