其他分享
首页 > 其他分享> > android – 处理Kotlin Coroutines生产商内部的取消

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