Сбросить слушателя с кнопки RxJava
Пробую первый день писать с использованием RxJava. Весь день не могу понять, как удалить слушатель с кнопки. ClickEvent у меня это просто object пустой, хочу научиться ловить клик.
val button: Button = findViewById(R.id.button)
val observable: Observable<ClickEvent> = Observable.create<ClickEvent> { emitter ->
val listener = View.OnClickListener {
object : View.OnClickListener {
override fun onClick(v: View?) {
emitter.onNext(ClickEvent)
}
}
}
button.setOnClickListener(listener)
emitter.setDisposable(Disposables.fromAction {
button. // сбросить слушатель
})
}
Ответы (1 шт):
Автор решения: ЮрийСПб
→ Ссылка
Чтобы сбросить слушатель нажатий надо в метод установки оного передать null
button.setOnClickListener(null)
Также есть уже библиотека, в которой всё это (и многое другое) реализовано: RxBinding
В её исходниках аналогичный код выглядит так:
@CheckResult
fun View.clicks(): Observable<Unit> {
return ViewClickObservable(this)
}
private class ViewClickObservable(
private val view: View
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnClickListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnClickListener {
override fun onClick(v: View) {
if (!isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
view.setOnClickListener(null)
}
}
}