Edited at

【Android】RxBinding Tips


detaches

ActivityやFragmentなどが破棄された場合にボタンのクリックイベントをキャンセル

する用にしたい場合。

        private val disposable = CompositeDisposable()

...
fun bindEvents() {
disposable += buttonReload.clicks()
.takeUntil(buttonReload.detaches())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { reloadData() }
}

override fun onDestroy() {
super.onDestroy()
disposable.dispose()
}

takeUntil(buttonReload.detaches()) を入れることで

buttonReloadがdetachされてもreloadDataが呼ばれないようにしている。

detachesに関してはこちらで実装されている

ちなみにclicklistenerの解除はいらない。

ここでdisposeされたらsetOnClickListenerにnullを設定している。

※ 2019/02/15 追記

ちなみにRecyclerViewなどのViewHolderでButton等のクリックを

  override fun onBindViewHolder(holder: XXXRecyclerViewHolder, position: Int) {

...
disposable += holder.button.clicks()
.takeUntil(holder.button.detaches())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { clickedListener?.onClicked(item) }
}

override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
super.onDetachedFromRecyclerView(recyclerView)
disposable.dispose()
}

こんな感じで takeUntil(holder.button.detaches()) なんてしてしまうと

スクロールした時に簡単にdetachされてしまい、二度とボタンが押せなくなるので注意

(こんなアホな事をするのは自分だけかもですが...)