Android 可观测到的星与isn';t在doOnNext发射
我的应用程序中有许多用于网络请求的可观察对象。既然这么多都是一样的,我对它们应用了一个可观察的变换:Android 可观测到的星与isn';t在doOnNext发射,android,rx-java,Android,Rx Java,我的应用程序中有许多用于网络请求的可观察对象。既然这么多都是一样的,我对它们应用了一个可观察的变换: /** * Creates a transformer that applies the schedulers and error handling for all of the observables in this ViewModel. */ private fun applyTransformations(): Observable.Transformer<NetworkStat
/**
* 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()
调用—一个用于提供的订户,另一个用于转换中的doOnNext
有没有办法修改这个startWith
调用,以发出我在doOnNext
中指定的内容?我使用的是rxjava1
编辑:为了进一步澄清,如果我跟踪排放的物质,我希望看到两件事<代码>加载->成功。我实际上看到的只是
成功
。如果我向可观察对象提供订阅者,我会看到加载->成功->成功
开始时间
应该在doOnNext
之前
Rxjava方法虽然看起来像是使用构建器模式,但实际上并不是这样。每次应用操作符时,它们都返回一个新的可观察值。在你的例子中,你的doOnNext observable在你开始使用observable之前就完成了,所以它的消费者不会被你在startWith中提供的东西调用
理想情况下,您应该:
observable
.startWith(NetworkState.Loading())
.doOnNext { publishState(it) }
.onErrorReturn { NetworkState.Error(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
另外,在没有消费者的情况下订阅oner,或者如果发生这种情况,请小心。由于您没有任何东西可以使用OneError,RxJava将使您的应用程序崩溃,因为它没有任何错误通知。考虑在订阅中使用“成功的用户”替换<代码> DOONNEX//CODE,如果您想忽略该错误,则使用一个空的用户。p>
另外,doOnNext
通常用于副作用,如日志记录和排序,它们比真正的函数运算符更方便。startWith
应该在doOnNext
之前
Rxjava方法虽然看起来像是使用构建器模式,但实际上并不是这样。每次应用操作符时,它们都返回一个新的可观察值。在你的例子中,你的doOnNext observable在你开始使用observable之前就完成了,所以它的消费者不会被你在startWith中提供的东西调用
理想情况下,您应该:
observable
.startWith(NetworkState.Loading())
.doOnNext { publishState(it) }
.onErrorReturn { NetworkState.Error(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
另外,在没有消费者的情况下订阅oner,或者如果发生这种情况,请小心。由于您没有任何东西可以使用OneError,RxJava将使您的应用程序崩溃,因为它没有任何错误通知。考虑在订阅中使用“成功的用户”替换<代码> DOONNEX//CODE,如果您想忽略该错误,则使用一个空的用户。p>
另外,doOnNext
通常用于副作用,如日志记录和排序,它们比真正的功能性操作员更方便。如果我没有消费者,它不会用OneRorReturn处理吗
?另外,我选择了doOnNext()
,因为我有大约6个可观察对象,我想给每个对象提供相同的订户。我可以在类级别定义订阅者,但我认为这已经足够好了。还要注意:我必须在doOnNext
之前移动onerrorrurn
,才能调用它。它现在可以工作了,但现在肯定有些困惑,我是否在这里实现了最佳实践。@AdamMc331 OneErrorReturn只在流中工作。如果发生错误并调用OnErrorReturn,并且doOnNext为,则doOnNext中的异常将使应用程序崩溃。另外,如果OneRorReturn是故障保护,那么它应该在doOnNext之前。如果我没有消费者,它不会用OneRorReturn
处理吗?另外,我选择了doOnNext()
,因为我有大约6个可观察对象,我想给每个对象提供相同的订户。我可以在类级别定义订阅者,但我认为这已经足够好了。还要注意:我必须在doOnNext
之前移动onerrorrurn
,才能调用它。它现在可以工作了,但现在肯定有些困惑,我是否在这里实现了最佳实践。@AdamMc331 OneErrorReturn只在流中工作。如果发生错误并调用OnErrorReturn,并且doOnNext为,则doOnNext中的异常将使应用程序崩溃。此外,如果onErrorReturn是故障保护,则应在doOnNext之前。