mic*_*brz 7 java android coroutine kotlin kotlinx.coroutines
我正在尝试从Java 7调用Kotlin函数.我正在使用协同程序,这个被调用的函数正在挂起,例如:
suspend fun suspendingFunction(): Boolean {
return async { longRunningFunction() }.await()
}
suspend fun longRunningFunction() : Boolean {
delay(400)
return true
}
Run Code Online (Sandbox Code Playgroud)
我在版本0.25.3中使用协同程序,我可以通过将Continuation<U>实例作为参数传递给挂起函数来模拟简单的Java回调样式,例如
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);
}
});
Run Code Online (Sandbox Code Playgroud)
但是,在更新到完全稳定的1.0.1版本后,我认为它已不再可能.假设暂停函数的更新版本如下所示:
suspend fun suspendingFunction(): Boolean {
return GlobalScope.async { longRunningFunction() }.await()
}
Run Code Online (Sandbox Code Playgroud)
Continuation<U>现在使用Result类,它似乎无法从Java中使用(这是有意义的,因为它是内联类).我试图使用Continuation协同程序的一些子类,但它们都是内部或私有的.
我知道通常建议将协程转换为CompletableFuture,但我在Android上,这意味着只有Java 7.Future另一方面,简单是太愚蠢,因为我不想定期检查函数是否完成 - 我只是想在完成时调用它.我真的想避免添加新的库或许多其他类/方法.
有没有简单的方法直接从Java 7调用挂起函数?
由于Kotlin试图与Java非常互操作,我想可以有一些简单的方法来做到这一点,但我还没有找到它.
您可以根据环境选择几种方法。
RxJava2在项目中使用,则该模块kotlinx-coroutines-rx2具有实用程序功能,可以在协程和Rx数据类型之间来回转换。例
suspend fun sayHello(): String {
delay(1000)
return "Hi there"
}
fun sayHelloSingle(): Single<String> = GlobalScope.rxSingle { sayHello() }
Run Code Online (Sandbox Code Playgroud)
Continuation类,该类与旧类的定义匹配,并且在Java端也很有用。示例(科特林边)
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)
}
Run Code Online (Sandbox Code Playgroud)
示例(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);
}
});
Run Code Online (Sandbox Code Playgroud)
您可以使用BuildersKt。这已经包含在 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0"
BuildersKt.launch(
GlobalScope.INSTANCE,
(CoroutineContext) Dispatchers.getMain(),
CoroutineStart.DEFAULT,
(Function2<CoroutineScope, Continuation<? super Unit>, Unit>) (coroutineScope, continuation) -> {
// your code here
return Unit.INSTANCE;
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |