簡體   English   中英

如何在 Java 中恢復 Kotlin 協程延續

[英]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 中為自己創建一個非常小的 util 以便在 Java 中使用它:

fun <T> resumeContinuationWithSuccess(cont: Continuation<T>, value: T) {
    cont.resumeWith(Result.success(value))
}
public void resume() {
    SuspendUtils.resumeContinuationWithSuccess(someSuspendFunctionContinuation, true);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM