Si vous ne voulez pas utiliser org.jetbrains.kotlinx:kotlinx-coroutines-jdk8
J'ai une nouvelle idée.
Ecrivez le code ci-dessous dans votre projet kotlin.
@JvmOverloads
fun <R> getContinuation(onFinished: BiConsumer<R?, Throwable?>, dispatcher: CoroutineDispatcher = Dispatchers.Default): Continuation<R> {
return object : Continuation<R> {
override val context: CoroutineContext
get() = dispatcher
override fun resumeWith(result: Result<R>) {
onFinished.accept(result.getOrNull(), result.exceptionOrNull())
}
}
}
Je l'écris dans mon Coroutines
classe
Ensuite, vous pouvez appeler votre fonction de suspension comme :
Coroutines coroutines = new Coroutines();
UserUtils.INSTANCE.login("user", "pass", coroutines.getContinuation(
(tokenResult, throwable) -> {
System.out.println("Coroutines finished");
System.out.println("Result: " + tokenResult);
System.out.println("Exception: " + throwable);
}
));
La fonction login() est une fonction de suspension.
suspend fun login(username: String, password: String): TokenResult
Pour votre code, vous pouvez :
doSomething(getContinuation((result, throwable) -> {
//TODO
}));
1 votes
Je ferais tout mon possible pour éviter d'avoir à le faire ; je ne m'attendrais pas à ce que cela fonctionne très efficacement. Par exemple, vous pourriez ajouter une autre fonction Kotlin pour lancer la coroutine de la manière que vous jugez appropriée, qui n'est pas une fonction de suspension, et l'appeler depuis Java.
1 votes
J'avais l'habitude de Code Java qui a réussi à créer une implémentation de
Continuation
et appeler unsuspend fun
mais dans Kotlin 1.3Continuation
déclareresumeWith(Result)
, dondeResult
est une union discriminée du résultat et d'uneinternal class Failure
et il n'y a aucun moyen de fournir cela à partir de Java, sauf en utilisant la réflexion pour accéder aux membres privés dans l'implémentation Kotlin.