我一直在寻找一个适合的解决方案或者最佳实践,以便在我想要使用Kotlin Flows和普通回调函数时使用。我的用例是编写一个使用Kotlin Flow内部的Kotlin库,并且我必须假设用户会使用Java等语言。因此,我认为最好的解决方案是重载基本的回调接口到我的Flow方法中,在 collect
中进行调用,类似于以下代码:
class KotlinClass {
interface Callback {
fun onResult(result: Int)
}
private fun foo() = flow {
for (i in 1..3) {
emit(i)
}
}
fun bar(callback: Callback) {
runBlocking {
foo().collect { callback.onResult(it) }
}
}
private fun main() {
bar(object : Callback {
override fun onResult(result: Int) {
TODO("Not yet implemented")
}
})
}
在我的Java应用程序中,我可以简单地像这样使用它:
public class JavaClass {
public void main() {
KotlinClass libraryClass = new KotlinClass();
libraryClass.bar(new KotlinClass.Callback() {
@Override
public void onResult(int result) {
// TODO("Not yet implemented")
}
});
}
}
我不确定应该怎么做,因为我希望我的Kotlin库可以在Java和Kotlin中使用并且使用Flows的方式良好。
我看到了callbackFlow
,但是那似乎只适用于将基于回调的API转换成流?因为我对Kotlin和Flows很陌生,请原谅如果我的问题由于缺少一些基本概念而有缺陷。
countdownLatch
部分,我是否真的需要从我的Java库中关闭coroutineScope,或者当它在Kotlin库中完成时,我可以直接终止它? - edhaircoroutineScope
,对于阻止调用线程也是如此。但是你的问题是,什么样的 API 才是好的。如果你在自己的库中这样做,就会对客户端使用产生很大的影响。从我的角度来看,更好的方式是让客户端自己决定阻塞线程是否是个好主意以及超时时间应该多长。 - Rene