重要的编辑:-下面的粗体字符-
* 一旦掌握了这个概念,
我强烈建议您看看这个link,它改变了生活,不仅因为我们使用不同的可观察对象,如Observable、Single、Maybe,可能需要不同的工具,如doOnEvent() for @ 987654328@ 和 doOnEach() 用于 Observable 但是因为如果你想调试,有一些原因为什么 doOnNext() 通常甚至不是理想的选择,因为我们可以忽略与解决问题相关的其他事件*
原始回复:-部分修改-
首先,doOnNext() 可以在 Observable 和 Subscribe 之间的运算符链中调用更多次,这为您提供了更多调试代码的可能性。由于其“流”性质,在 RXJava 中不容易进行调试,doOnNext() 反而使调试更容易。为此,您还可以考虑将其与doOnError() 运算符结合使用。为什么不使用简单的onNext()?因为调试与代码的逻辑没有严格的关系,理论上你也可以在生产前去掉doOnNext()。
要理解的一个非常重要的事情是,给定一个订阅长链的 Observable,您可以在特定点使用 doOnNext,以查看操作员正在回馈给另一个操作员:
例如:
Observable.just("Donald", "Duck", "Mickey", "Goofy",
"Uncle")
.doOnNext{System.out.println("Here ou will get the strings above:$it ")}
.map{it.length}
.subscribe { println("Here you will get the numbers of how every string is long: $it") }}
使用doOnNext() 的典型用例可能发生在您想要缓存来自服务器的响应时,例如您可以使用map() 但also doOnNext(),因为它允许您您的代码更具可读性,因为您可以放置一个简单的onNext(),理想情况下可以按照其他说明进行结构化。 (正如所有的架构思想一样,这是有争议的)
等同于doOnNext(),用于相同的调试目的
您可以使用其他不言自明的运算符:
doOnSubscribe()、doOnUnsubscribe()、doOnCompleted()、doOnError()、
doOnTerminate(),finallyDo(), doOnEach(), doOnRequest()
doOnNext() 让您可以看到 Observable(通常很长)链中发生了什么,真正重要的是 您可以在不影响任何操作的情况下窥探链中发生的事情,没有进行任何转换(假设不是我们在命令式代码中使用的Log.d,而不是响应式代码)。这就是为什么称为 side 效果。
编辑(因为 cmets 中的问题):
doOnNext()和上面的方法只是回调,请参考官方文档所说的that、doOnNext()
只是修改一个 Observable 以便它在调用时调用一个动作
onNext。
真的很简单,这就是为什么有时会调用来上传进度条,但也确实用于存储库模式,例如,如果您想在调用改造后将数据存储到数据库/或缓存。
如果你真的很好奇,doSomethingReactive 方法只需在“真实”方法 SomethingReactive 中调用方法 call()(来自接口操作的回调)