RxJava2+Retrofit2實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求封裝(二)

前面我們<<RxJava2+Retrofit2實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求封裝>>已經(jīng)學(xué)會(huì)了去封裝簡單網(wǎng)絡(luò)請(qǐng)求框架,但是在網(wǎng)絡(luò)請(qǐng)求的生命周期部分處理的太過粗糙了,今天我們將引入Rxlifecycle來實(shí)現(xiàn)全自動(dòng)化的管理,也使代碼更加的簡潔可控.

引入依賴

關(guān)于RxJava2和Retrofit2的依賴引入請(qǐng)參考前面的文章,我們直接從Rxlifecycle說起.

compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'

引入時(shí)需要對(duì)應(yīng)Rxjava的版本.現(xiàn)在所需要的包都有了,現(xiàn)在就可以再次折騰了.

新建RxUtil類,來做Rxjava的使用代碼簡化

public class RxUtil {
    /**
     * 無進(jìn)度Schedulers
     */
    public static <T> ObservableTransformer<T, T> applySchedulers() {
        return new ObservableTransformer<T, T>() {
            @Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
                return upstream
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());

            }
        };
    }

    /**
     * 有進(jìn)度Schedulers
     */
    public static <T> ObservableTransformer<T, T> applySchedulers(@NonNull final Dialog dialog) {
        return new ObservableTransformer<T, T>() {
            @Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
                return upstream
                        .delay(1, TimeUnit.SECONDS)
                        .subscribeOn(Schedulers.io())
                        .doOnSubscribe(new Consumer<Disposable>() {
                            @Override
                            public void accept(@NonNull final Disposable disposable) throws Exception {
                                dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                                    @Override public void onCancel(DialogInterface dialog) {
                                        disposable.dispose();
                                    }
                                });
                                dialog.show();
                            }
                        })
                        .observeOn(AndroidSchedulers.mainThread())
                        .doOnTerminate(new Action() {
                            @Override public void run() throws Exception {
                                dialog.dismiss();
                            }
                        });
            }
        };
    }
}

主要有兩個(gè)方法,一個(gè)是無加載進(jìn)度的,這個(gè)就很簡單了,不帶Dialog參數(shù)的就只是單純的指定線程,而帶有Dialog參數(shù)的則在前面的基礎(chǔ)上實(shí)現(xiàn)了doOnSubscribedoOnTerminate這兩個(gè)方法.doOnSubscribe主要處理了加載進(jìn)度的顯示及實(shí)現(xiàn)了取消請(qǐng)求的功能,doOnTerminate該方法不論是處理異常還是成功,都會(huì)最后執(zhí)行,就像finally一樣.

為了能獲取到bindToLifecycle()的方法,需要我們?nèi)ctivity和Fragment繼承RxAppCompatActivityRxFragment,當(dāng)然我們也可以不去繼承,但是需要參照RxAppCompatActivity的代碼去實(shí)現(xiàn)接口LifecycleProvider<ActivityEvent>,Fragment同樣.

有了上面的代碼,再結(jié)合<<RxJava2+Retrofit2實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求封裝>>里面封裝過的內(nèi)容,新的網(wǎng)絡(luò)請(qǐng)求封裝就完成了.

食用方法:

@POST("api/account/loginWithToken")
Observable<Result<Account>> loginWithToken();

RetrofitManager.getInstance().create(IAccount.class).loginWithToken()
                    .compose(RxUtil.<Result<Account>>applySchedulers(loadingDialog))
                    .compose(this.<Result<Account>>bindToLifecycle())
                    .subscribe(new ResultObserver<Account>() {
                        @Override public void handlerResult(Account account) {
                            ShareData.getInstance().login(mContext, account);
                            handler.sendEmptyMessageDelayed(FLAG_SKIP_TO_HOME, 2000);
                        }
                    });

以上是項(xiàng)目中的一次網(wǎng)絡(luò)請(qǐng)求,已經(jīng)簡化了很多代碼,網(wǎng)絡(luò)請(qǐng)求的錯(cuò)誤和異常,我通過eventBus發(fā)給了BaseActivity來處理,當(dāng)然都是很通用的處理,如果是需要對(duì)個(gè)別的需要特殊處理請(qǐng)結(jié)合自身情況做修改.

同時(shí)我更新了網(wǎng)絡(luò)請(qǐng)求結(jié)果的類ResultObserver和前面文章中的BaseSubscriber基本差不多,請(qǐng)自行腦補(bǔ).

同時(shí)我也新增了一個(gè)類來處理在Service中我們使用網(wǎng)絡(luò)請(qǐng)求時(shí)的請(qǐng)求結(jié)果的處理

public abstract class ResultCallBack<T> implements Callback<Result<T>> {
    @Override public void onResponse(Call<Result<T>> call, Response<Result<T>> response) {
        if (response.body().getCode() == Constants.NET_CODE_SUCCESS) {
            handlerResult(true, null, response.body().getData());
        } else {
            handlerResult(false, new Throwable(response.body().getMsg()), null);
        }
    }

    @Override public void onFailure(Call<Result<T>> call, Throwable t) {
        handlerResult(false, t, null);
    }

    public abstract void handlerResult(boolean success, Throwable throwable, T t);
}

以上就是全部內(nèi)容,歡迎各位小伙伴點(diǎn)贊,關(guān)注.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弧蝇,更是在濱河造成了極大的恐慌,老刑警劉巖看疗,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異两芳,居然都是意外死亡摔寨,警方通過查閱死者的電腦和手機(jī)怖辆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竖螃,“玉大人淑廊,你說我怎么就攤上這事特咆〖境停” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵画拾,是天一觀的道長。 經(jīng)常有香客問我青抛,道長,這世上最難降的妖魔是什么酬核? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮愁茁,結(jié)果婚禮上亭病,老公的妹妹穿的比我還像新娘鹅很。我一直安慰自己罪帖,他們只是感情好促煮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布整袁。 她就那樣靜靜地躺著菠齿,像睡著了一般坐昙。 火紅的嫁衣襯著肌膚如雪绳匀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天疾棵,我揣著相機(jī)與錄音,去河邊找鬼是尔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拟枚,可吹牛的內(nèi)容都是我干的薪铜。 我是一名探鬼主播恩溅,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼隔箍,長吁一口氣:“原來是場噩夢啊……” “哼暴匠!你這毒婦竟也來了鞍恢?” 一聲冷哼從身側(cè)響起每窖,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤帮掉,失蹤者是張志新(化名)和其女友劉穎窒典,沒想到半個(gè)月后蟆炊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瀑志,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年劈猪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昧甘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片战得。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖常侦,靈堂內(nèi)的尸體忽然破棺而出浇冰,到底是詐尸還是另有隱情聋亡,我是刑警寧澤肘习,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布坡倔,位于F島的核電站漂佩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仅仆。R本人自食惡果不足惜器赞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一墓拜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咳榜,春花似錦夏醉、人聲如沸涌韩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靶擦。三九已至雇毫,卻和暖如春玄捕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枚粘。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馍迄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓攀圈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親峦甩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容