如何正确清理/处置定期执行可完成的Disposable?

时间:2018-04-20 07:28:52

标签: android kotlin rx-java2

我有一个一次性的,在某个时间间隔内对API执行请求

   val disposable =
    Flowable.interval(0, UPDATE_INTERVAL, TimeUnit.MILLISECONDS)
        .map {
          someRepository.sync(id)
              .doOnSubscribe { disposables?.add(it) }
              .subscribe()
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnError { Timber.e(it, "Unable to sync") }
        .subscribe()
disposables?.add(disposable)

我试图在onBackPressed方法中清除它:

override fun onBackPressed() {
  super.onBackPressed()
  disposables?.dispose()
}

然而,它没有被清除,我在Android Studio Profiler中看到它在我点击后退按钮后仍在执行此Flowable。

我做错了什么?

更新:

当我将地图运算符更改为flatMap时,akarnokd建议:

Error:(160, 11) Type inference failed: fun <R : Any!> flatMap(p0: 
((Long) -> Publisher<out R!>!)!, p1: Int): Flowable<R!>!
cannot be applied to
((Long) -> Completable,Int)

1 个答案:

答案 0 :(得分:1)

首先,您使用处理程序订阅而不是使用flatMap / concatMap

val disposable =
Flowable.interval(0, UPDATE_INTERVAL, TimeUnit.MILLISECONDS, Schedulers.io())
    .onBackpressureDrop()
    .flatMapCompletable ({ someRepository.sync(id) }, 1)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({ }, { Timber.e(it, "Unable to sync") })

disposables.add(disposable)

override fun onBackPressed() {
    super.onBackPressed()
    disposables.clear()
}

2)您可以指定interval的主题。 3).subscribeOn(Schedulers.io())无效,interval在其自己的线程上发出。 4)doOnError不是错误处理,而只是错误偷看。错误仍会导致您的流量/应用程序崩溃。 5)disposables.clear()通常是对清理运行流程的更好调用,以便下次可以重用相同的disposables

  

我在Android Studio Profiler中看到它仍在执行

即使很尴尬,原始设置也应该停在dispose()上。我最好的猜测是disposables?.add没有执行,因为disposables在某个时候是或者变为空。