Я пытаюсь вызвать функцию Kotlin из Java 7. Я использую сопрограммы, и эта вызываемая функция приостанавливается, например:
suspend fun suspendingFunction(): Boolean {
return async { longRunningFunction() }.await()
}
suspend fun longRunningFunction() : Boolean {
delay(400)
return true
}
Я использовал сопрограммы в версии 0.25.3 и мог эмулировать простой стиль обратного вызова Java, передавая экземпляр Continuation<U>
в качестве аргумента для приостановившей функции, например,
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);
}
});
Однако после обновления до полностью стабильной версии 1.0.1 я думаю, что это больше невозможно. Допустим, обновленная версия функции приостановки выглядит так:
suspend fun suspendingFunction(): Boolean {
return GlobalScope.async { longRunningFunction() }.await()
}
Continuation<U>
теперь использует класс Result
, который кажется непригодным для Java (что имеет смысл, поскольку он встроенный класс). Я пытался использовать некоторый подкласс Continuation
из сопрограмм, но они все внутренние или частные.
Я знаю, что обычно рекомендуется преобразовать сопрограмму в CompletableFuture
, но я работаю на Android, что означает только Java 7. Простой Future
, с другой стороны, слишком тупой, так как я не хочу периодически проверять, завершена ли функция - я просто хочу, чтобы ее вызывали, когда она закончена. И я действительно хотел бы избежать добавления новых библиотек или множества дополнительных классов / методов.
Есть ли простой способ вызвать функцию приостановки прямо из Java 7?
Поскольку Kotlin пытается очень легко взаимодействовать с Java, я думаю, что есть какой-то простой способ сделать это, но я еще не нашел его.