使用doOnSubscribe和doFinally使Rxjava代码更整洁

原文地址:https://medium.com/@ValCanBuild/making-rxjava-code-tidier-with-doonsubscribe-and-dofinally-3748f223d32d#.33dq74dav

使用Rxjava的很多时候都会遵循相同的模式,一个常见的示例就是我们在应用程序中加载网络数据,几乎所有情况下的代码都是这样的:

  • 显示加载状态
  • 加载数据
  • 当数据已经加载完毕的时候需要隐藏加载状态和更新UI
  • 如果出现了错误,隐藏加载状态然后显示一些错误信息

下面就是我们经常使用的代码:

public void onViewCreated(View view){
  view.showLoadingIndicator();
  
  loadFromServer()
    .compose(applySchedulers())
    .subscribe(data -> {
      view.hideLoadingIndicator();
      view.showData(data);
    },error -> {
      view.hideLoadingIndicator();
      view.showError(error);
    });
  
  loadData();
}

你可能已经发现了,我们经常会写这些重复的代码,比如说view.hideLoadingIndicator(),你可能会觉得这些不值得一提,但是有时候我们会遇到更加复杂的逻辑,所以我们要尽量的简化这些代码:

这里要介绍两个方便的操作符,使用它们会是代码更加清洁,doOnSubscribedoFinally(这是RxJava2的操作符),现在看一下它们能做什么:

  • doOnSubscribe - 修改源,以便从订阅者订阅是调用给定的操作
  • doFinally - 在onError和或onCompleted后调用指定的操作,或由下游处理。

第一个允许我们在观察着订阅时立即执行动作,第二个语序我们在调用完成时立即执行动作,不管他是否成功。

在上面的示例中使用这两个操作符:

public void onViewCreated(View view){
  loadFromServer()
    .compose(applySchedulers)
    .doOnSubscribe(_ -> view.showLoadingIndicator())
    .doFinally(() -> view.hideLoadingIndicator())
    .subscribe(data -> {
      view.showData(data);
    },error -> {
      view.showError(error);
  });
  loadData();
}

小的改变,但是却整理我们代码的风格,设置这些代码现在就可以作为链的一部分来执行,订阅处理程序只处理与他们直接相关的内容。

你可能感兴趣的:(使用doOnSubscribe和doFinally使Rxjava代码更整洁)