Cómo llamar a Kotlin suspender la función de Java 7 corrutina

michalbrz:

Estoy intentando llamar a la función Kotlin desde Java 7. Estoy usando corrutinas y esta función se llama está suspendiendo, por ejemplo:

suspend fun suspendingFunction(): Boolean {
    return async { longRunningFunction() }.await()
}

suspend fun longRunningFunction() : Boolean {
    delay(400)
    return true
}

Yo estaba usando corrutinas en la versión 0.25.3 y pude emular estilo sencillo de devolución de llamada Java pasando Continuation<U>ejemplo como un argumento para la función de suspensión, por ejemplo,

CoroutinesKt.suspendingFunction(new Continuation<Boolean>() {
    @Override
    public CoroutineContext getContext() {
        return EmptyCoroutineContext.INSTANCE;
    }

    @Override
    public void resume(Boolean value) {
        doSomethingWithResult(value);
    }

    @Override
    public void resumeWithException(@NotNull Throwable throwable) {
        handleException(throwable);
    }
});

Sin embargo, después de actualizar a versión completamente estable 1.0.1, creo que ya no es posible. Digamos versión actualizada de suspender las miradas de función así:

suspend fun suspendingFunction(): Boolean {
    return GlobalScope.async { longRunningFunction() }.await()
}

Continuation<U>ahora utiliza Resultla clase, lo que parece ser inutilizables desde Java (lo cual tiene sentido ya que es la clase en línea). Yo estaba tratando de utilizar alguna subclase de Continuationde corrutinas pero todos ellos son internos o privado.

Sé que por lo general se recomienda para transformar a corrutinaCompletableFuture , pero estoy en Android, lo que significa Java 7 solamente. Sencilla Futurepor el contrario es demasiado tonto como yo no quiero comprobar periódicamente si se termina la función - Sólo quiero que se llamará cuando esté terminado. Y me gusta mucho para evitar la adición de nuevas bibliotecas o muchas clases / métodos adicionales.

¿Hay alguna forma sencilla de llamar a la función suspender directamente desde Java 7?

Como Kotlin intenta ser muy interoperable con Java Me imagino que habría alguna manera fácil de hacer eso, pero estoy todavía para encontrarlo.

Omar Mainegra:

Usted tiene varias opciones dependiendo de su entorno.

  1. Si está utilizando RxJava2en el proyecto, el módulo kotlinx-coroutines-rx2tiene funciones de utilidad a la espalda convertido adelante y hacia atrás entre los co-rutinas y tipos de datos Rx.

Ejemplo

suspend fun sayHello(): String {
    delay(1000)
    return "Hi there"
}

fun sayHelloSingle(): Single<String> = GlobalScope.rxSingle { sayHello() }
  1. De lo contrario, se podría añadir una nueva Continuationclase que coincide con la definición de la anterior y también es útil en el lado de Java.

Ejemplo (lado Kotlin)

abstract class Continuation<in T> : kotlin.coroutines.Continuation<T> {
    abstract fun resume(value: T)
    abstract fun resumeWithException(exception: Throwable)
    override fun resumeWith(result: Result<T>) = result.fold(::resume, ::resumeWithException)
}   

Ejemplo (lado Java)

sayHello(new Continuation<String>() {
    @Override
    public CoroutineContext getContext() {
        return EmptyCoroutineContext.INSTANCE;
    }

    @Override
    public void resume(String value) {
        doSomethingWithResult(value);
    }

    @Override
    public void resumeWithException(@NotNull Throwable throwable) {
        doSomethingWithError(throwable);
    }
});

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136503&siteId=1
Recomendado
Clasificación