在RxJava中doOnNext(...)的目的是什么?

时间:2015-02-09 04:07:56

标签: java rx-java

我们何时应该使用Observable中的doOnNext()而不是onNext()?

2 个答案:

答案 0 :(得分:68)

doOnNext用于副作用:您希望在流的中间步骤中对项目排放做出反应(例如,日志),例如在流过滤之前,针对横向行为(如日志记录),但是您仍然希望值在流中传播。

onNext更为终结,它消耗了价值。

答案 1 :(得分:14)

首先,在Observable和Subscribe之间的运算符链中,doOnNext()可以被称为甚至更多次,这为您提供了调试代码的更多可能性。由于其“流”性质,在RXJava中进行调试并不容易,doOnNext()反而使调试更容易。为此,您还可以考虑将其与doOnError()运算符组合使用。为什么不使用简单的onNext()?因为调试与代码的逻辑没有严格的关系,理论上你也可以在生产之前消除doOnNext()

当您想要缓存来自服务器的响应时,会发生另一种使用它的可能性,例如,您可以使用map()also doOnNext(),因为它允许您让你的代码更具可读性,相反,你会设置一个简单的onNext(),理想情况下可以按照其他说明进行结构化。 (这是有争议的,因为所有的建筑思想)

我发现在RXJava2中使用此运算符的一个典型示例是显示进度条,特别是当您在不使用所有三种已知方法(onNext,onError,onComplete)的情况下订阅Observer时就是这种情况来自此博客小节的此片段中显示的RXJava2中Consumer的订阅:Show Progress Bar with doOnNext(< -please如果您点击此链接,因为这是一个很长的教程直接转到半页到看看如何使用'doOnNext'无论如何都遵循一个简单的小片段:

@Override
protected void onStart() {
super.onStart();
Observable<String> searchTextObservable = createButtonClickObservable();

searchTextObservable

  .observeOn(AndroidSchedulers.mainThread())

  //HERE IT IS
  .doOnNext(new Consumer<String>() {
    @Override
    public void accept(String s) {
      showProgressBar();
    }
  })
  .observeOn(Schedulers.io())
  .map(new Function<String, List<String>>() {
    @Override
    public List<String> apply(String query) {
      return mCheeseSearchEngine.search(query);
    }
  })
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Consumer<List<String>>() {
    @Override
    public void accept(List<String> result) {

      hideProgressBar();
      showResult(result);
    }
  });

等同于doOnNext()并且用于相同的调试目的 你可以使用其他不言自明的算子:

  

doOnSubscribe(),doOnUnsubscribe(),doOnCompleted(),doOnError(),   doOnTerminate(),finallyDo(),doOnEach(),doOnRequest()

编辑(由于评论中的问题):

doOnNext()以及上述方法只是回调,请参阅thatdoOnNext(),正如官方文档所述

  

只需修改一个Observable,以便在调用时调用一个动作   onNext。

非常简单,这就是为什么有时会调用上传进度条的原因,但实际上也是在存储库模式中使用,例如,如果要在调用改进后将数据存储到db /或缓存中。

如果你真的很好奇,那么doSomethingReactive方法只需在“真实”方法中调用方法call()(来自界面操作的回调)SomethingReactive