我有一个一次性的,在某个时间间隔内对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)
答案 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
在某个时候是或者变为空。