我所搭建的MVVM設(shè)計(jì)模式的Android框架(三)

網(wǎng)絡(luò)通信用的就是okhttp,這一篇就不詳細(xì)介紹了弟胀,主要分享一下封裝好的工具類。
用到的依賴庫:

    //網(wǎng)絡(luò)框架
    implementation 'com.squareup.okhttp3:okhttp:4.6.0'
    //網(wǎng)絡(luò)請求封裝框架
    implementation 'com.squareup.retrofit2:retrofit:2.6.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.6.2'
public class RetrofitUtil {

    private Retrofit sRetrofit;

    private RetrofitUtil() {
        sRetrofit = initRetrofit();
    }

    private static class Inner {
        private static final RetrofitUtil INSTANCE = new RetrofitUtil();
    }

    /**
     * 獲取 靜態(tài)內(nèi)部類單例
     * @return 靜態(tài)內(nèi)部類單例
     */
    public static RetrofitUtil getInstance() {
        return Inner.INSTANCE;
    }

    /**
     * 創(chuàng)建 Retrofit 實(shí)例
     * @return Retrofit實(shí)例
     */
    private Retrofit initRetrofit() {
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder()
                .readTimeout(10, TimeUnit.SECONDS)    //傳輸超時時間
                .connectTimeout(10, TimeUnit.SECONDS)    //連接超時時間
                //網(wǎng)絡(luò)數(shù)據(jù)查看攔截器
                .addInterceptor(new CustomInterceptor());

        final Gson gson = new GsonBuilder()
                .disableHtmlEscaping() //禁止轉(zhuǎn)碼
                .setLenient()  //允許超長字符串
                .create();

        return new Retrofit.Builder()
                .baseUrl(“這里填服務(wù)器地址(http://www.xxx.com/)”)  //服務(wù)器地址
                .client(builder.build())
                .addConverterFactory(CustomGsonConverterFactory.create(gson))//解析的封裝類
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用注解方式把請求定義成接口
                .build();
    }

    /**
     * 創(chuàng)建 Api 請求類
     * @param api Api請求原始反射類
     * @param <T> 泛型
     * @return Api請求類
     */
    public <T> T create(final Class<T> api) {
        return sRetrofit.create(api);
    }
}

CustomInterceptor網(wǎng)絡(luò)攔截器我要額外說一下咖楣,當(dāng)時的網(wǎng)絡(luò)攔截器會主動請求服務(wù)器兩次,當(dāng)時讓我找了好久才找到位置改好,下面是改好后的。

public class CustomInterceptor implements Interceptor {

    @NotNull
    @Override
    public Response intercept(@NotNull Chain chain) throws IOException {

        Request request = chain.request();
        RequestBody requestBody = request.body();
        if (requestBody instanceof FormBody) {
            //表單請求
            FormBody formBody = (FormBody) requestBody;
            StringBuilder strBuilder = new StringBuilder();

            for (int i = 0; i < formBody.size(); ++i) {
                String encodeName = formBody.encodedName(i);
                String encodeValue = formBody.encodedValue(i);
                String name = formBody.name(i);
                String value = formBody.value(i);
                strBuilder.append(name + "=" + value + "\n");
//                strBuilder.append(" encodeName: " + encodeName + "  encodeValue: " + encodeValue + "  name: " + name + "  value: " + value);
            }
            System.out.println("請求頭: " + formBody.contentType());
            System.out.println("請求體: " + strBuilder.toString());
            System.out.println("url:" + request.url());
        } else if (requestBody instanceof MultipartBody) {
            //文件上傳請求
            MultipartBody multipartBody = (MultipartBody) requestBody;
        }

        Response response = chain.proceed(request);
        ResponseBody responseBody = response.body();
        BufferedSource source = responseBody.source();
        source.request(Long.MAX_VALUE); // Buffer the entire body.
        Buffer buffer = source.getBuffer();
        Charset UTF8 = Charset.forName("UTF-8");

        System.out.println("返回?cái)?shù)據(jù): " + buffer.clone().readString(UTF8));

        return response;
    }

}

使用方法:

public class BaseBean<T> {

    @SerializedName("code")
    public int code;
    @SerializedName("msg")
    public String msg;
    @SerializedName("data")
    public T data;

    public T getData() {
        return CastUtil.cast(data);
    }

}

public class LoginBean {

    @SerializedName("id")
    public String id;
    @SerializedName("username")
    public String username;
    @SerializedName("password")
    public String password;

}
/**
     * 網(wǎng)絡(luò)請求接口
     *
     * @param postMap 數(shù)據(jù)
     * @return Single
     */
    @FormUrlEncoded
    @POST("這里填接口地址(index/index/login)")
    Single<這里填bean類(BaseBean<LoginBean>)> login(@FieldMap Map<String, Object> postMap);
RetrofitUtil.getInstance()
         .create(ServerApi.class)
         .login(postMap)//Map參數(shù)集合
         .subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
         .subscribe((BaseBean<LoginBean> bean) -> {

          }, (Throwable throwable) -> {
               throwable.printStackTrace();
          });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糯而,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泊窘,更是在濱河造成了極大的恐慌熄驼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烘豹,死亡現(xiàn)場離奇詭異谜洽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吴叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阐虚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚌卤,你說我怎么就攤上這事实束。” “怎么了逊彭?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵咸灿,是天一觀的道長。 經(jīng)常有香客問我侮叮,道長避矢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任囊榜,我火速辦了婚禮审胸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卸勺。我一直安慰自己砂沛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布曙求。 她就那樣靜靜地躺著碍庵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悟狱。 梳的紋絲不亂的頭發(fā)上静浴,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音挤渐,去河邊找鬼苹享。 笑死,一個胖子當(dāng)著我的面吹牛挣菲,可吹牛的內(nèi)容都是我干的富稻。 我是一名探鬼主播掷邦,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椭赋!你這毒婦竟也來了抚岗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哪怔,失蹤者是張志新(化名)和其女友劉穎宣蔚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體认境,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胚委,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叉信。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亩冬。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硼身,靈堂內(nèi)的尸體忽然破棺而出硅急,到底是詐尸還是另有隱情,我是刑警寧澤佳遂,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布营袜,位于F島的核電站,受9級特大地震影響丑罪,放射性物質(zhì)發(fā)生泄漏荚板。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一吩屹、第九天 我趴在偏房一處隱蔽的房頂上張望跪另。 院中可真熱鬧,春花似錦祟峦、人聲如沸罚斗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袱吆,卻和暖如春厌衙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绞绒。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工婶希, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓬衡。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓喻杈,卻偏偏與公主長得像彤枢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筒饰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355