Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 可观测到的星与isn';t在doOnNext发射_Android_Rx Java - Fatal编程技术网

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之前。