我正在使用Android创建一个Kotlin应用。我使用suspendCoroutine
将回调API转换为suspend function
。目前我有以下代码。
while(true){
newSuspendFunction().let{ value ->
//do some simple work
}
yield()
}
字符串
我的newSuspendFunction
沿着在
suspend fun newSuspendFunction() {
suspendCoroutine { cont ->
InterfaceWithCallback { value ->
cont.resume(value)
}.let { myInterfaceWithCallback ->
registerInterfaceWithCallback(myInterfaceWithCallback)
}
}
}
型
问题是,这是否会引入运行时开销并在每次调用函数时重新示例化InterfaceWithCallback
,或者它是否会在内存中的某个位置创建一个单例并执行优化?
**编辑:**我需要转换一个多镜头API,所以callbackFlow
是一个有效的解决方案。
1条答案
按热度按时间jq6vz3qz1#
每次调用
newSuspendFunction
都会创建一个新的InterfaceWithCallback
示例,因为lambda捕获了延续cont
,这在每次调用suspendCoroutine
时都不同。尽管如此,这并不意味着这个开销会很大。短生存期的对象对垃圾收集器来说可能不是一个大问题。你需要衡量这是否真的对性能有可衡量的影响。
此外,循环中不需要
yield()
,因为newSuspendFunction
已经是一个实际挂起的挂起函数。最后但并非最不重要的一点是,为什么要调用这些
.let
?我发现在可能的情况下避免嵌套块更容易阅读。你可以使用变量而不是let
:)编辑:现在,你的用例似乎需要一个
Flow
而不是一个suspend函数,因为你的回调被重复调用。你可以使用callbackFlow
来 Package 你的基于回调的API:字符串
作为参考,这里是
newSuspendFunction
的反编译字节码,你可以在这里看到new MainJvmKt$newSuspendFunction$2$1(cont)
:型
这里假设
InterfaceWithCallback
声明为:型