gpt4 book ai didi

android - 可观察的 startWith 未在 doOnNext 中发出

转载 作者:行者123 更新时间:2023-11-29 14:59:49 24 4
gpt4 key购买 nike

我的应用程序中有许多用于网络请求的 Observable。由于有太多相同之处,我对它们应用了 Observable 转换:

/**
* Creates a transformer that applies the schedulers and error handling for all of the observables in this ViewModel.
*/
private fun applyTransformations(): Observable.Transformer<NetworkState, NetworkState> {
return Observable.Transformer { observable ->
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { NetworkState.Error(it) }
.doOnNext { publishState(it) }
.startWith(NetworkState.Loading())
}
}

我试图通过上述实现的目标:

  • 应用一致的调度器
  • 通过返回我的密封类的实例来处理任何错误。
  • 通过发布可观察对象返回的状态来处理任何 onNext。
  • 首先发送 Loading 状态。

这大部分工作正常,但我注意到当我调用 startWith 和加载状态时,它实际上从未被 doOnNext() 处理。换句话说,永远不会为我的加载状态调用 publishState()

在设置可观察对象的地方,我懒得添加订阅者,因为上面的 doOnNext() 就是我所需要的:

val subscription = repository.getInstagramPhotos(count)
.map { mapIGPhotoResponse(it) }
.compose(applyTransformations())
.subscribe()

不过,如果我在上面提供订阅者,它将处理加载状态。它还将处理两个 onNext() 调用 - 一个用于提供的订阅者,一个用于转换中的 doOnNext

有没有办法修改此 startWith 调用以发出我在 doOnNext 中指定的任何内容?我正在使用 RxJava 1。

编辑:为了进一步澄清,如果我跟踪发出的内容,我希望看到两件事。 加载 -> 成功。我实际看到的只是 Success。如果我向可观察对象提供订阅者,我会看到 Loading -> Success -> Success

最佳答案

startWith 应该在 doOnNext 之前。

Rxjava 方法,虽然它们看起来像是使用构建器模式,但实际上并没有。每次应用运算符时,它们都会返回一个新的可观察对象。在您的情况下,您的 doOnNext 可观察对象在您开始使用可观察对象之前完成,因此它的消费者不会使用您在 startWith 中提供的内容来调用。

理想情况下,您应该:

observable
.startWith(NetworkState.Loading())
.doOnNext { publishState(it) }
.onErrorReturn { NetworkState.Error(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

此外,如果发生 onEror,请注意在没有 Consumer 的情况下订阅。因为你没有什么可以消耗 onError,RxJava 将崩溃你的应用程序,因为它没有任何错误通知。考虑将 doOnNext 替换为订阅中的成功消费者,如果您想忽略它,则将错误消费者替换为空消费者。

此外,doOnNext 通常用于副作用,例如日志记录和排序,它们比真正的函数运算符更方便。

关于android - 可观察的 startWith 未在 doOnNext 中发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49501421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com