【问题标题】:RxJava - RepeatWhen not cancelling after disposal?RxJava - RepeatWhen 处置后不取消?
【发布时间】: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.如果我添加后立即检查尺寸,它是正确的尺寸。因此,在添加它和处置它之间的某个地方,对它的所有引用都将丢失,因此处置不会停止调用。我将不得不调查我的代码中其他地方可能发生的情况。

标签: android rx-java rx-java2


【解决方案1】:

所以我不确定我是否理解为什么这会解决问题,但以下解决了它。

最初我的 dispose 调用发生在 onStop() 中。我注意到我的 dispose 调用在我关闭应用程序时有效,但在我启动新活动时它不起作用。

我尝试将 dispose 移到我的 onPause 中,认为可能在 onStop 调用可弃用中的引用时已经丢失,现在它可以正常工作了。

这可能是我的存储库设置方式的副作用?我必须进一步调查,但这就是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2019-03-19
    • 2016-04-28
    相关资源
    最近更新 更多