Appeler une fonction de suspension Kotlin à partir de Java
J'ai une bibliothèque Kotlin que j'essaie d'appeler depuis Java. Je n'ai jamais travaillé avec Kotlin auparavant.
La fonction de la bibliothèque Kotlin est la suivante :
suspend fun decode(jwt: String): UsefulThing {
// does a bunch of stuff, removed for brevity.
return otherthing.getUsefulThing(jwt)
}
Comment puis-je appeler cela depuis Java? Pour l'instant j'ai essayé :
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
Je ne vois jamais de sortie de console. On dirait que la continuation n'est jamais appelée ou qu'elle est exécutée dans un autre contexte. J'ai étudié d'autres réponses et les coroutines semblent avoir traversé un certain nombre d'itérations - je ne trouve pas d'explication qui ait vraiment du sens pour moi.
Je dois noter que je suis en cours d'exécution sur Java 11.
Comment puis-je simplement appeler la fonction kotlin?
Je suggère de ne même pas essayer. Les fonctions de suspension n'ont jamais été conçues pour l'interopérabilité Java.
Au lieu de cela, convertissez-le du côté Kotlin en quelque chose que Java comprend - en CompletableFuture
:
fun decodeAsync(jwt: String): CompletableFuture<UsefulThing> = GlobalScope.future { decode(jwt) }
Nous pouvons librement mélanger du code Java et Kotlin dans un seul module, afin que vous puissiez créer un tel wrapper dans votre projet.
Selon votre cas, vous pouvez utiliser GlobalScope
(en Java, nous n'avons pas de concurrence structurée) ou vous pouvez créer une personnalisation CoroutineScope
et gérer son cycle de vie manuellement.