如果你不想用,我有一个新想法。org.jetbrains.kotlinx:kotlinx-coroutines-jdk8
在你的 kotlin 项目中编写以下代码。
@JvmOverloads
fun <R> getContinuation(onFinished: BiConsumer<R?, Throwable?>, dispatcher: CoroutineDispatcher = Dispatchers.Default): Continuation<R> {
return object : Continuation<R> {
override val context: CoroutineContext
get() = dispatcher
override fun resumeWith(result: Result<R>) {
onFinished.accept(result.getOrNull(), result.exceptionOrNull())
}
}
}
我在课堂上写它Coroutines
然后,您可以调用挂起函数,如下所示:
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);
}
));
login() 函数是一个挂起函数。
suspend fun login(username: String, password: String): TokenResult
对于您的代码,您可以:
doSomething(getContinuation((result, throwable) -> {
//TODO
}));
此外,您可能希望在不同的线程(例如主线程)中运行回调代码,只需用于包装launch(Dispathers.Main)
resumeWith()