android – 处理Kotlin Coroutines生产商内部的取消
作者:互联网
是否有可能在生产者构建器本身内处理生产者取消?取消订阅回调可能很有用:
private fun changes(key: String) = produce<Unit>(UI, CONFLATED) {
val listener = OnSharedPreferenceChangeListener { _, changedKey ->
if (key == changedKey) offer(Unit)
}
prefs.registerOnSharedPreferenceChangeListener(listener)
???.onCancel {
prefs.unregisterOnSharedPreferenceChangeListener(listener)
}
}
或者可能存在实现这种情况的另一种方式?
解决方法:
首先,您不应该使用产品构建器以这种方式使API与侦听器一致,因为在产生构建器主体存在时,通道立即关闭并且将停止服务其功能.相反,您应该只创建一个Channel()并创建相应的连接.
不幸的是,频道目前不提供安装取消听众的开箱即用方式(见issue #341).在通道关闭时立即获得通知的唯一方法是扩展相应的通道类,这将导致以下代码:
private fun changes(key: String): ReceiveChannel<Unit> = object : ConflatedChannel<Unit>() {
val listener = OnSharedPreferenceChangeListener { _, changedKey ->
if (key == changedKey) offer(Unit)
}
init {
prefs.registerOnSharedPreferenceChangeListener(listener)
}
override fun afterClose(cause: Throwable?) {
prefs.unregisterOnSharedPreferenceChangeListener(listener)
}
}
标签:android,kotlin,kotlinx-coroutines 来源: https://codeday.me/bug/20190910/1801469.html