自定義Retrofit網(wǎng)絡回調(diào)結果

原文鏈接:http://www.reibang.com/p/f565a687ba75

1.麻煩:相信很多同學都用的Retrofit作為網(wǎng)絡請求框架了,確實方便椿争。但我覺得對于回調(diào)結果的處理就很麻煩了沛硅,如下:
 private void IndexTextAdOld() {
        dataProvider.shop.indexTextAd().subscribe(new Observer<BaseResponse<IndexTextAd>>() {
            @Override
            public void onSubscribe(Disposable d) {
            }
            @Override
            public void onNext(BaseResponse<IndexTextAd> indexTextAdBaseResponse) {
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onComplete() {
            }
        });
    }

這面的Observer回調(diào)包含了四個方法,但我只想關心成功后的結果趁啸,就是onNext中的內(nèi)容师郑,有的說可以用Consumer但這樣編譯器會爆灰色今缚,而且并沒有處理異常情況:

灰色警告

2.封裝:為了只關心成功數(shù)據(jù),所以我們還是得封裝一下:
public abstract class OnSuccessAndFailListener<T> extends DisposableObserver<T> {

    Dialog loadDialog;
    SwipeRefreshLayout refresh;
    private void showLoading(){
        if (loadDialog!=null) loadDialog.show();
        if (refresh!=null) refresh.setRefreshing(true);
    }
    private void dismissLoading(){
        if (loadDialog!=null) loadDialog.dismiss();
        if (refresh!=null) refresh.setRefreshing(false);
    }
    public OnSuccessAndFailListener() {}
    public OnSuccessAndFailListener(Dialog loadDialog) {
        this.loadDialog=loadDialog;
    }
    public OnSuccessAndFailListener(SwipeRefreshLayout refresh) {
        this.refresh=refresh;
    }
    @Override
    protected void onStart() {
        super.onStart();
        showLoading();
    }
    @Override
    public void onNext(T t) {
        dismissLoading();
        try {
            BaseResponse baseResponse = (BaseResponse) t;
            if (baseResponse.getStatus()==1){
                onSuccess(t);
            }else {
                onErr(baseResponse.getMsg());
            }
        } catch (Exception e) {
            onError(e);
            onErr(e.getMessage());
        }
    }
    @Override
    public void onError(Throwable e) {
        dismissLoading();
        e.printStackTrace();
        String message;
        if (e instanceof SocketTimeoutException){
            message="SocketTimeoutException:網(wǎng)絡連接超時惯疙!";
        }else if (e instanceof ConnectException){
            message="ConnectException:網(wǎng)絡無法連接翠勉!";
        } else if (e instanceof HttpException) {
            message="HttpException:網(wǎng)絡中斷妖啥,請檢查您的網(wǎng)絡狀態(tài)霉颠!";
        } else if (e instanceof UnknownHostException) {
            message="UnknownHostException:網(wǎng)絡錯誤,請檢查您的網(wǎng)絡狀態(tài)荆虱!";
        }else {
            message = e.getMessage();
        }
        onErr(message);
    }

    @Override
    public void onComplete() {}
    protected abstract void onSuccess(T t);
    //很多異常不需要反饋給用戶蒿偎,所以不必抽象,如果需要異常信息怀读,重寫即可
    protected  void onErr(String msg){
        L.e("網(wǎng)絡數(shù)據(jù)異常:"+msg);
    }
}

其中BaseResponse為我們自己定義的網(wǎng)絡數(shù)據(jù)回調(diào)類基類诉位,這里
我們是狀態(tài)碼為1的時候,說明數(shù)據(jù)是正確的菜枷。有的可能是200苍糠,看后端各自定義來更改。

3.使用

dataProvider.shop.indexTextAd()
.subscribe(new OnSuccessAndFailListener<BaseResponse<IndexTextAd>>() {
     @Override
     protected void onSuccess(BaseResponse<IndexTextAd> indexTextAdBaseResponse) {
                
     }
});
    

特點如下:

  • 1.只關注正確數(shù)據(jù)的回調(diào)處理
  • 2.異常情況統(tǒng)一處理啤誊,如需單獨處理岳瞭,重寫onErr()方法即可
  • 3.加載進度一參傳入,無需關心加載開始結束

注意:新項目可能會遇到OnSuccessAndFailListener里面的泛型不自動補充的問題蚊锹,那么你多半是沒有引入java8的支持瞳筏。

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

最后寫代碼如下寫就可以了:


封裝的回調(diào)
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牡昆,隨后出現(xiàn)的幾起案子姚炕,更是在濱河造成了極大的恐慌,老刑警劉巖丢烘,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柱宦,死亡現(xiàn)場離奇詭異,居然都是意外死亡播瞳,警方通過查閱死者的電腦和手機掸刊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐史,“玉大人痒给,你說我怎么就攤上這事说墨。” “怎么了苍柏?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵尼斧,是天一觀的道長。 經(jīng)常有香客問我试吁,道長棺棵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任熄捍,我火速辦了婚禮烛恤,結果婚禮上,老公的妹妹穿的比我還像新娘余耽。我一直安慰自己缚柏,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布碟贾。 她就那樣靜靜地躺著币喧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袱耽。 梳的紋絲不亂的頭發(fā)上杀餐,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音朱巨,去河邊找鬼史翘。 笑死,一個胖子當著我的面吹牛冀续,可吹牛的內(nèi)容都是我干的琼讽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼沥阳,長吁一口氣:“原來是場噩夢啊……” “哼跨琳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桐罕,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脉让,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后功炮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溅潜,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年薪伏,在試婚紗的時候發(fā)現(xiàn)自己被綠了滚澜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫁怀,死狀恐怖设捐,靈堂內(nèi)的尸體忽然破棺而出借浊,到底是詐尸還是另有隱情,我是刑警寧澤萝招,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布蚂斤,位于F島的核電站,受9級特大地震影響槐沼,放射性物質(zhì)發(fā)生泄漏曙蒸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一岗钩、第九天 我趴在偏房一處隱蔽的房頂上張望纽窟。 院中可真熱鬧,春花似錦兼吓、人聲如沸臂港。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趋艘。三九已至,卻和暖如春凶朗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背显拳。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工棚愤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杂数。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓宛畦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揍移。 傳聞我的和親對象是個殘疾皇子次和,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355