Saltar al contenido

Llame a la función de suspensión de Kotlin en la clase Java

La guía o código que verás en este post es la resolución más rápida y válida que hallamos a tu duda o problema.

Solución:

Primero, agrega org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 módulo a sus dependencias. En su archivo Kotlin, defina la siguiente función asíncrona que corresponde al estilo Java de escribir API asíncronas:

fun doSomethingAsync(): CompletableFuture> =
    GlobalScope.future  doSomething() 

Ahora usa doSomethingAsync desde Java de la misma manera que está utilizando otras API asíncronas en el mundo de Java.

Para coroutines 1.3.0 use esto:

BuildersKt.launch(GlobalScope.INSTANCE,
                Dispatchers.getMain(),//context to be ran on
                CoroutineStart.DEFAULT,
                (coroutineScope, continuation) -> suspendFunction(arguments)
        );

Para java <8:

BuildersKt.launch(
        GlobalScope.INSTANCE,
        Dispatchers.getMain(),//context to be ran on
        CoroutineStart.DEFAULT,
        new Function2, Unit/*or your return type here*/>() 
            @Override
            public Unit/*or your return type here*/ invoke(CoroutineScope coroutineScope, Continuation continuation) 
                //do what you want
                return Unit.INSTANCE; //or something with the defined type
            
        
);

Mi archivo gradle:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"

usos de kotlin static clases para funciones de extensión, el lanzamiento es una función de extensión, por lo que se define en BuildersKt. El primer parámetro es el objetivo de la función de extensión, el resto son los parámetros de las funciones de extensión.

Si no quieres usar org.jetbrains.kotlinx:kotlinx-coroutines-jdk8tengo una nueva idea.

Escriba el código a continuación en su proyecto kotlin.

    @JvmOverloads
    fun  getContinuation(onFinished: BiConsumer, dispatcher: CoroutineDispatcher = Dispatchers.Default): Continuation 
        return object : Continuation 
            override val context: CoroutineContext
                get() = dispatcher

            override fun resumeWith(result: Result) 
                onFinished.accept(result.getOrNull(), result.exceptionOrNull())
            
        
    

lo escribo en mi Coroutines clase

Luego puede llamar a su función de suspensión como:

            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 función login() es una función de suspensión.
suspend fun login(username: String, password: String): TokenResult

Para su código, puede:

doSomething(getContinuation((result, throwable) ->  
       //TODO
));

Recuerda que puedes difundir este escrito si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *