【发布时间】:2018-05-05 20:21:34
【问题描述】:
我有一个重复的 observable,但是当需要处理它时,例如当我移动到另一个屏幕时,它会继续在后台重复?
我很肯定它正在被处理,因为我已经停止了代码并确认它正在发生。我也很肯定它不会重新启动,因为一旦我移动到新屏幕,该函数就不会再次被调用。
起初我以为它会停止,但经过一番阅读,听起来重复可能超出了我正在清除的一次性用品,所以我尝试在重复时声明中添加 if/else。
observable.observeOn(AndroidSchedulers.mainThread())
.repeatWhen { result ->
if(!disposable.isDisposed) {
result.delay((20000 + delay), TimeUnit.MILLISECONDS)
}else {
Observable.empty<Int>()
}
}
.subscribeOn(Schedulers.io())
.subscribe({ result ->
//Do something
}, { error ->
error.printStackTrace()
}).addTo(tickerDisposables)
当我调用disposables.dispose 并切换屏幕时如何停止?
注意 - observable 是泛型类型,所以我需要在执行 Observable.empty() 时添加一个类型
更新:看起来问题出在我的代码中的其他地方。当我尝试处理它时,我的tickerDisposable 的大小是空的,所以它不会停止调用。如果我找到它应该解决的问题。
【问题讨论】:
-
您何时/如何致电
.dispose()?当你处理它时,这一切都应该终止。我认为您没有在正确的时间调用 dispose。 -
repeatWhen为每个订阅者执行一次其 lambda,因此,您的 isDisposed 检查仅在运算符开始运行时发生一次。如果您通过tickerDisposables处理整个流程,它也应该停止重复。 -
我在我的片段中调用 dispose onStop。我可以看到通话发生。然后我进入下一个屏幕(触发 onStop 的原因),网络调用仍在后台进行
-
好的,所以我做了更多的调查,虽然我还没有修复,但我发现如果我放置一个断点并在我的tickerDisposable被处理之前检查它的大小,大小是0.如果我添加后立即检查尺寸,它是正确的尺寸。因此,在添加它和处置它之间的某个地方,对它的所有引用都将丢失,因此处置不会停止调用。我将不得不调查我的代码中其他地方可能发生的情况。