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 super Unit> 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-jdk8
tengo 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ó.