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されてしまい、二度とボタンが押せなくなるので注意
(こんなアホな事をするのは自分だけかもですが...)