android retrofit 的簡單封裝

從剛進這家公司開始,搭建項目的時候,就開始使用retrofit網(wǎng)絡框架了,雖然有考慮過volley,和或者將okhttp封裝一層,但是最后還是被retrofit注解式的網(wǎng)絡請求方式打敗了,代碼簡介,加上retrofit又完美結合了rxjava非常的方便,好了,讓我們來認真的了解一下它吧。

什么是retrofit?

首先retrofit是一個開源網(wǎng)絡庫,目前比較火的開源庫有volley、okhttp、retrofit,其中 okhttp和retrofit是有square團隊開發(fā)的,volley是谷歌退出的一款網(wǎng)絡庫。
補充一下,retrofit中使用的是okhttp,對于retrofit個人理解其實就是對okhttp進行了再次封裝,提供了更方便好用,代碼更簡潔的一個開源庫。

retrofit的使用

項目的配置
配置依賴:

  • Lambda表達式
  • Retrofit2
  • GsonConverter
  • RxJavaAdapter
  • RxAndroid
  • Logging
    plugins {
    id "me.tatarka.retrolambda" version "3.2.5"
    }
    // ...
    android {
    // ...
    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8;
    targetCompatibility JavaVersion.VERSION_1_8;
    }
    }
    dependencies {
    // ...
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1'
    }

首先需要創(chuàng)建一個REST API接口,我們所有的請求都是在借口中寫的,因為項目中會有很多類型的借口請求,所以封裝了一層。

    public static <T> T creeatApis(Class<T> clazz, String baseUrl, String token) {
    //        Gson gson = new GsonBuilder()
    //                .registerTypeAdapter(clazz, new MyDeserializer<T>())
    //                .registerTypeAdapter(clazz, new MyDeserializer<T>())
    //                .create();
            Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl)//- Base URL: 總是以 /結尾- @Url: 不要以 / 開頭
                    //你也可以通過實現(xiàn)Converter.Factory接口來創(chuàng)建自己的轉換器
                    .addConverterFactory(ArbitResponseBodyConvertFactory.create())//添加自定義的解析器
                    .client(initClient(token))//Retrofit 2.0上,OKHttp是必須
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//Service接口現(xiàn)在可以作為Observable返回了
                    .build();
            return retrofit.create(clazz);
        }

每個步驟都加入了相應的注解,相信應該看得懂的哈。
由于項目中的借口返回參數(shù)是固定的,所以對解析器也做了一個自定義。關于自定義解析器,大家可以看看這篇文章呢,寫的很詳細呢

公司請求借口分會參數(shù)類型都是這樣的

    {
        errcode: 0,
        errmsg:"返回提示信息",
        data:object
    }

只有data參數(shù)是不確定的,所以做了一層封裝,最主要的代碼如下

    @Override
        public ResultJsonModel convert(ResponseBody value) throws IOException {

            ResultJsonModel resultJsonModel = new ResultJsonModel();

            try {
                JSONObject jsonObject = new JSONObject(value.string());
                int errcode = jsonObject.getInt("errcode");
                String errmsg = jsonObject.getString("errmsg");
                String data = jsonObject.get("data").toString();

                resultJsonModel = new ResultJsonModel();
                resultJsonModel.setData(data);
                resultJsonModel.setErrcode(errcode);
                resultJsonModel.setErrmsg(errmsg);

    //                LogUtils.e("resultJsonModel==="+resultJsonModel.toString());
            } catch (JSONException e) {
                e.printStackTrace();
                LogUtils.e("JSONException===" + e.toString());
            }
            return resultJsonModel;
        }

我將返回的結果,用一個自定義的model接收了,不確定的data參數(shù),保留了原來json的字符串,更方便靈活
,關于這幾個封裝的文件已經(jīng)上傳到github上了

    /**
         * 設置okHttp的初始化
         */
        public static OkHttpClient initClient(final String token) {

            //用于輸出網(wǎng)絡請求和結果的 Log,可以配置 level 為 BASIC / HEADERS / BODY
    //        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    //        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            OkHttpClient client = new OkHttpClient.Builder()
    //                .addInterceptor(interceptor)
                    .retryOnConnectionFailure(true)
                    .connectTimeout(15, TimeUnit.SECONDS)//設置超時時間
                    .addNetworkInterceptor(new NetWorkInterceptor(token))
                    .build();
            //   設置cookie     http://blog.csdn.net/sbsujjbcy/article/details/46895039
            //        client.setCookieHandler()
            return client;
        }

在設置okhttp的時候,可以設置超時時間,請求頭等設置,請求頭設置有很多種方式,可以參考這幾種
retrofit header通用設置
retrofit header設置

需要用的時候直接

//請求api
public PlatformApi platformApi = RetrofitMaker.creeatApis(PlatformApi.class, HttpConfig.URL_HOST, "");

有人要問了,你把結果的data還原成json格式還是要解析,是不是很麻煩,哈哈,不要著急,在這里,我又做了一層封裝,加上rxJava的使用,在你的present拿到數(shù)據(jù)之前,我就已經(jīng)把所有的數(shù)據(jù)都解析分析完成了,等于是扒了一層皮,把有用的和沒有的進行分類,先看看,我的分類處理呢

    /**
         * 請求網(wǎng)絡返回模版-返回固定的model
         */
        public <T> void linkModel(final Activity context, final boolean showLoading, Observable<ResultJsonModel> observable, final Class<T> tClass, final RetrofitLisener<T> lisener) {
            if (checkNetWork(context, showLoading)) {
                lisener.onfinished(showLoading, false, context);
                return;
            }
            
            observable
                    // Subscriber前面執(zhí)行的代碼都是在I/O線程中運行
                    .subscribeOn(Schedulers.io())
                    // 操作observeOn之后操作主線程中運行.
                    .observeOn(AndroidSchedulers.mainThread())
                    .unsubscribeOn(Schedulers.io())
                    //onNext,onError,onCompleted
                    .subscribe(resultJsonModel -> {//onNext
                        LogUtils.e("onNext===" + resultJsonModel.toString());

                        switch (resultJsonModel.getErrcode()) {
                            case  錯誤碼:
                                break;
                            case 錯誤碼:// 缺少登錄Token
                                tokenUnuse(getMyApplication);
                                break;
                            case  錯誤碼://請求成功
                                T loginModel1 = new Gson().fromJson(resultJsonModel.toString(), tClass);
                                lisener.onSucceed(loginModel1);
                                break;
                            default://一般的錯誤
                                lisener.onfailed(resultJsonModel);
                                break;
                        }
                    }, throwable -> {//onError
                        lisener.onfinished(showLoading,true, getMyApplication);
                        LogUtils.e("onError===" + throwable.toString());

                    }, () -> {//onCompleted
                        lisener.onfinished(showLoading,true, getMyApplication);
                    });
        }
  • . 在請求數(shù)據(jù)之前一般是一些網(wǎng)絡情況的判斷
  • . 在拿到數(shù)據(jù)之后,將數(shù)據(jù)進行過濾,沒用的或者錯誤的進行處理(拿到的數(shù)據(jù)又分為三個部分)
    1. 請求成功的數(shù)據(jù)
    2. 請求失敗的數(shù)據(jù)
    3. 請求結束,最后finally需要做的回調(diào)
  • . 將拿到的正確數(shù)據(jù)返回給界面中

哈哈,這樣我每個需要請求的借口只需要一行代碼就可以搞定了,是不是很方便呢

linkModel(context, showLoading, platformCApi.creatediary(map), ResultModel.class, lisener);

在此對retrofit的簡單封裝就完成了呢,以上有什么錯誤,或者對retrofit更好的處理,可以告知我哦。

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

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

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