Retrofit2和RxJava配合使用時(shí)的錯(cuò)誤處理

在Retrofit和RxJava配合使用時(shí),我們會(huì)在構(gòu)建Retrofit對(duì)象時(shí)加上這樣一句話:

addCallAdapterFactory(RxJavaCallAdapterFactory.create())

這樣我們就可以從service的方法中獲取到observable對(duì)象了。

public interface MyService {
    @GET("user/me")
    Observable<User> getUser();
}

其實(shí)RxJavaCallAdapterFactory使用RxJava創(chuàng)建observables時(shí),支持三種不同的Observable參數(shù)配置。

  1. Observable<User>,直接使用body。對(duì)于響應(yīng)碼為2XX的,在OnNext方法中直接返回反序列化的body。而非2XX相應(yīng)碼在onError方法中表現(xiàn)為HttpException,網(wǎng)絡(luò)錯(cuò)誤在OnError方法中表現(xiàn)為IOException。
  2. Observable<Response<User>>,使用Response包裹body。所有Http請(qǐng)求的響應(yīng)體都可以在OnNext方法中拿到,不管響應(yīng)碼是否為2XX。而網(wǎng)絡(luò)錯(cuò)誤會(huì)在OnError方法中表現(xiàn)為IOException。
  3. Observable<Result<User>>,使用Result包裹body。所有Http請(qǐng)求的響應(yīng)體和網(wǎng)絡(luò)錯(cuò)誤都會(huì)在OnNext方法中。

由于現(xiàn)在服務(wù)端返回的數(shù)據(jù)類型大都是下面這個(gè)樣子的:

{
  "code":"",
  "message":"",
  "data":{

  }
}

"code"為服務(wù)端與客戶端約定的自定義錯(cuò)誤代碼,”message"為錯(cuò)誤信息,”data”里面才是真正的業(yè)務(wù)邏輯數(shù)據(jù)。

所以對(duì)于這種情況就需要定義一個(gè)BodyResponse類來和這樣的數(shù)據(jù)類型相對(duì)應(yīng),如下:

public class BodyResponse<T> {
  private String code;
  private String message;
  private T data;

  //getter and setter
}

如果data里面的數(shù)據(jù)為列表的話,使用后面兩種方法的話,observable就會(huì)寫成Observable<Response<BodyResponse<List<User>>>>或者Observable<Result<BodyResponse<List<User>>>>,不知道你們感覺如何,反正我是感覺整個(gè)人都不好了。所以我會(huì)使用第一種寫法,相信這也是大部分人的寫法。

那么使用第一種方式的話,我們的Observable就會(huì)寫成Observable<BodyResponse<User>>。那么在響應(yīng)碼非2XX的情況下,我們就可以在onError方法中來進(jìn)行錯(cuò)誤處理了。

observer
.subscribe(new Subscriber<User>() {
                            @Override
                            public void onCompleted() {
                            }

                            @Override
                            public void onError(Throwable throwable) {
                                BodyResponse errBody = ErrorHandler.handle(throwable);
                                // do something with code or message
                            }

                            @Override
                            public void onNext(User user) {

                            }
                        });

ErrorHandler

public class ErrorHandler {

    public static BodyResponse handle(Throwable throwable) {
        if (throwable instanceof HttpException) {
            HttpException error = (HttpException) throwable;
            try {
                return new Gson().fromJson(error.response().errorBody().string(),
                        BodyResponse.class);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            throwable.printStackTrace();
        }
        return null;
    }
}

是不是很方便呢,很簡(jiǎn)單呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容