Retrofit+Rxjava幾個小技巧

鏈式請求

鏈式請求

巧用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操作符,制定一個條件









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章