Прежде всего, вам не следует использовать компоновщик produce
для такой адаптации API со слушателями, поскольку при существовании из тела компоновщика produce
канал немедленно закрывается и перестает выполнять свою функцию.Вместо этого вы должны просто создать Channel()
и создать соответствующие соединения.
К сожалению, в настоящее время каналы не предоставляют готового способа установки прослушивателей отмены (см. выпуск # 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)
}
}