BuildersKt.launch(GlobalScope.INSTANCE,
Dispatchers.getMain(),//context to be ran on
CoroutineStart.DEFAULT,
(coroutineScope, continuation) -> suspendFunction(arguments)
);
对于java〈8:
BuildersKt.launch(
GlobalScope.INSTANCE,
Dispatchers.getMain(),//context to be ran on
CoroutineStart.DEFAULT,
new Function2<CoroutineScope, Continuation<? super Unit>, 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
}
}
);
4条答案
按热度按时间nwnhqdif1#
首先,将
org.jetbrains.kotlinx:kotlinx-coroutines-jdk8
模块添加到依赖项中,在Kotlin文件中定义以下异步函数,该函数对应于编写异步API的Java风格:现在使用来自Java的
doSomethingAsync
,方法与使用Java世界中的其他异步API相同。agyaoht72#
如果你不想用
org.jetbrains.kotlinx:kotlinx-coroutines-jdk8
,我有个新主意。在你的Kotlin项目中写下下面的代码。
我在
Coroutines
类中编写了它然后您可以调用suspend函数,如下所示:
login()函数是一个挂起函数。
suspend fun login(username: String, password: String): TokenResult
对于您的代码,您可以:
此外,您可能希望在不同的线程(例如主线程)中运行回调代码,只需使用
launch(Dispathers.Main)
PackageresumeWith()
即可更新:我的朋友开发了一个插件kotlin-jvm-blocking-bridge,它可以自动生成阻塞桥,用于从Java调用挂起函数,而且非常简单,也给予尝试一下。
wgmfuz8q3#
对于协程1.3.0,使用以下命令:
对于java〈8:
我的Gradle文件:
Kotlin使用静态类作为扩展函数,launch是一个扩展函数,所以在BuildersKt中定义,第一个参数是扩展函数的目标,其余的都是来自扩展函数的参数。
c9qzyr3d4#
我创建了基于@Kenvix答案的接口类,使其与旧的Android SDK兼容(低于API 24)
用法
现在通过传递
CoroutineCallback
从任何java类调用suspend函数