鏈式請求
巧用ZIP操作符
場景:一個頁面需要請求2個接口,曾經我們項目經常這樣,在沒有rxjava的時候,很頭疼,一般我都是讓接口合成1個,但是有時候數據量比較大或者後臺接口也是從2個其它接口獲取的數據,我們可以通過zip操作符來完成
Observable.zip(api.login(parameters), api.login(parameters), new BiFunction<UserInfo, UserInfo, String>() {
@Override
public String apply(UserInfo userInfo, UserInfo userInfo2) throws Exception {
return userInfo.getMsg() + " 組合" + userInfo2.getMsg();
}
})
.compose(RxTransformerHelper.<String>schedulerTransf())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.d("wyz","請求成功!:" + s);
}
@Override
public void onError(Throwable e) {
Log.d("wyz","出錯!:" + e.getMessage());
}
@Override
public void onComplete() {
}
});
將多個Obserbles發射物組合,最終收到的數據集是就A接口的請求數據和B接口的請求數據,按照定義的規則進行組合
巧用retry操作符
場景:重試網絡請求,例如在網絡請求失敗以後,我們要進行重試,重試N次以後,結束請求,以前的方式實現比較麻煩,代碼結構也很噁心retry操作符和repet重複操作符一樣,只是在訂閱出發時機不一樣,repet操作符是在OnComplete結束後,從新訂閱,retry操作符是在onError錯誤後從新訂閱
Observable.zip(api.login(parameters), api.login(parameters), new BiFunction<UserInfo, UserInfo, String>() {
@Override
public String apply(UserInfo userInfo, UserInfo userInfo2) throws Exception {
return userInfo.getMsg() + " 組合" + userInfo2.getMsg();
}
})
.retry(3)
.compose(RxTransformerHelper.<String>schedulerTransf())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.d("wyz","請求成功!:" + s);
}
@Override
public void onError(Throwable e) {
Log.d("wyz","出錯!:" + e.getMessage());
}
@Override
public void onComplete() {
}
});
注意:repet是只要在onError觸發的時候,就會從新訂閱,如果要按照自己規則的異常錯誤需要使用retryWen操作符,制定一個條件