使用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()
,你可能会觉得这些不值得一提,但是有时候我们会遇到更加复杂的逻辑,所以我们要尽量的简化这些代码:
这里要介绍两个方便的操作符,使用它们会是代码更加清洁,doOnSubscribe
和doFinally
(这是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();
}
小的改变,但是却整理我们代码的风格,设置这些代码现在就可以作为链的一部分来执行,订阅处理程序只处理与他们直接相关的内容。