LoginSignup
1
1

More than 5 years have passed since last update.

【Android】RxBinding Tips

Last updated at Posted at 2018-11-14

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1