Appeler une fonction de suspension Kotlin à partir de Java


Gabriel Bauman

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?

pain

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 CoroutineScopeet gérer son cycle de vie manuellement.

Articles connexes


appeler une fonction de suspension dans une fonction normale

beigirad Je veux appeler le blocage d'une fonction de suspension dans une fonction normale, mais ne bloque pas Thread pour terminer la fonction de suspension, puis revenir Response override fun intercept(chain: Interceptor.Chain): Response { // getSession

Comment appeler une fonction Kotlin à partir de JavaScript

Elizabeth Harper J'essaie de remplir un TextViewemplacement situé à l'intérieur WebView(sous Android) avec un e-mail aléatoire généré à l' Kotlin functionaide de JavaScript, mais je n'ai trouvé aucune solution. Mon Kotlin functionpour générer une adresse e-mai

Appeler la fonction en ligne Kotlin à partir de Java

aristotll Exceptions.kt: @Suppress("NOTHING_TO_INLINE") inline fun generateStyleNotCorrectException(key: String, value: String) = AOPException(key + " = " + value) À kotlin: fun inKotlin(key: String, value: String) { throw generateStyleNotCorrectE

Comment appeler une fonction kotlin de haut niveau en java?

Chriss Supposons qu'une fonction kotlin est définie en dehors d'une classe en tant que fonction de niveau supérieur. Util.kt: class Util { fun bar() } fun foo(){} Comment puis-je appeler une méthode foo()en Java? Aasmund Eldhuset foosera compilé en une fon