【发布时间】:2018-03-26 22:09:08
【问题描述】:
我的应用中有许多用于网络请求的 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())
}
}
我试图通过上述方法实现的目标:
- 应用一致的调度程序
- 通过返回我的密封类的实例来处理任何错误。
- 通过发布 observable 返回的状态来处理任何 onNext。
- 首先发送一个 Loading 状态。
这几乎可以正常工作,但我注意到,当我调用startWith 和加载状态时,它实际上从未由doOnNext() 处理。换句话说,我的加载状态永远不会调用publishState()。
在我设置 observables 的地方,我懒得添加订阅者,因为上面的 doOnNext() 就是我所需要的:
val subscription = repository.getInstagramPhotos(count)
.map { mapIGPhotoResponse(it) }
.compose(applyTransformations())
.subscribe()
如果我在上面提供一个订阅者,它会处理加载状态。它还将处理两个onNext() 调用——一个用于提供的订阅者,一个用于转换中的doOnNext。
有没有办法修改这个startWith 调用以发出我在doOnNext 中指定的任何内容?我正在使用 RxJava 1。
编辑:只是为了澄清一些,如果我跟踪发出的内容,我希望看到两件事。 Loading -> Success。我实际看到的只是Success。如果我向 observable 提供订阅者,我会看到 Loading -> Success -> Success。
【问题讨论】: