android retrofit 的简单封装

从刚进这家公司开始,搭建项目的时候,就开始使用retrofit网络框架了,虽然有考虑过volley,和或者将okhttp封装一层,但是最后还是被retrofit注解式的网络请求方式打败了,代码简介,加上retrofit又完美结合了rxjava非常的方便,好了,让我们来认真的了解一下它吧。

什么是retrofit?

首先retrofit是一个开源网络库,目前比较火的开源库有volley、okhttp、retrofit,其中 okhttp和retrofit是有square团队开发的,volley是谷歌退出的一款网络库。
补充一下,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'
    }

首先需要创建一个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: 不要以 / 开头
                    //你也可以通过实现Converter.Factory接口来创建自己的转换器
                    .addConverterFactory(ArbitResponseBodyConvertFactory.create())//添加自定义的解析器
                    .client(initClient(token))//Retrofit 2.0上,OKHttp是必须
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//Service接口现在可以作为Observable返回了
                    .build();
            return retrofit.create(clazz);
        }

每个步骤都加入了相应的注解,相信应该看得懂的哈。
由于项目中的借口返回参数是固定的,所以对解析器也做了一个自定义。关于自定义解析器,大家可以看看这篇文章呢,写的很详细呢

公司请求借口分会参数类型都是这样的

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

只有data参数是不确定的,所以做了一层封装,最主要的代码如下

    @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参数,保留了原来json的字符串,更方便灵活
,关于这几个封装的文件已经上传到github上了

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

            //用于输出网络请求和结果的 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拿到数据之前,我就已经把所有的数据都解析分析完成了,等于是扒了一层皮,把有用的和没有的进行分类,先看看,我的分类处理呢

    /**
         * 请求网络返回模版-返回固定的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前面执行的代码都是在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);
                    });
        }
  • . 在请求数据之前一般是一些网络情况的判断
  • . 在拿到数据之后,将数据进行过滤,没用的或者错误的进行处理(拿到的数据又分为三个部分)
    1. 请求成功的数据
    2. 请求失败的数据
    3. 请求结束,最后finally需要做的回调
  • . 将拿到的正确数据返回给界面中

哈哈,这样我每个需要请求的借口只需要一行代码就可以搞定了,是不是很方便呢

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

在此对retrofit的简单封装就完成了呢,以上有什么错误,或者对retrofit更好的处理,可以告知我哦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容