找到属于自己的RxJava+Retrofit2网络请求

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_435559203/article/details/52681651

现在网络上面铺天盖地都是RxJava+Retrofit2的博客,还有好多大神不断地造轮子。然后在前段时间,由于项目的空档期,我就对自己现在负责的项目尝试了一下这RxJava+Retrofit2的写法,对于我来说,首先是大量地看各位大神的博客,从中不断吸取精华,在结合自己公司的后台完成的一套属于自己项目的一套网络请求。下面我只针对我的项目情况来描述我的理解。

1.Retrofit介绍

2.Gradle配置

3.简单使用Retrofit2+RxJava

4.自定义JSON解析、错误请求处理、拦截器、降低代码冗余。

  • Retrofit介绍

Retrofit是SQUARE美国一家移动支付公司最近新发布的在Android平台上http访问的开源项目,Retrofit与okhttp共同出自于Square公司,我们在HttpClient被弃用后,在HttpURLConnection使用的期间,大家想必会发现okHttp的网络请求开源项目,然后在网络拼命搜okHttp的二次封装,然而retrofit对okhttp做了一层封装,把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了。

  • Gradle配置

首先我们在Gradle文件中进行配置
这里写图片描述
然而对于RxJava和Retrofit的版本差异我就不详细描述,有兴趣的同学可以逐一去学习。

  • 简单使用Retrofit2+RxJava

    1. 创建Retrofit2请求工具类
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("url")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
2. 定义请求API
    @FormUrlEncoded
    @POST(URLs.Login)
    Observable<LoginBean> login(@FieldMap() Map<String, String> maps);
3. 简单使用
        RetrofitManage.getInstance().getHttpServiceConnection().login(maps)
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io()) 
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<LoginBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(LoginBean loginBean) {

                    }
                });

上面的是最简单的Retrofit2+RxJava的用法,对于还处于认知阶段的同学可以参考一下,但是对于已经有一定了解的同学,上面说的可能一点用处都没有,下面我们才是本篇的重点。在Retrofit2+RxJava使用过程中,我们结合项目,其实会遇到很多不同的问题,我们应该如何再次优化、再次封装。

如何适应不同的项目不同业务

  • 代码过多重复

重复的RxJava处理,我们可以封装一个方法统一使用RxJava来处理。
这里写图片描述

另外大家都可以看到我们每一次的请求,你需要多次重复的写回调处理,我们需要再次优化。
这里写图片描述

最终效果
这里写图片描述
我们不用每一次的请求去写大量重复的代码,这样给人一种较为整洁的感觉。

  • 我的后台返回数据各种奇葩、原始数据嵌套多层、某情况需前端特殊处理返回数据等等(过多不吐槽),我们不能顺利使用GsonConverterFactory来转化我们需要的JavaBean,于是我们定义一个适用的JsonConverterFactory。

RetrofitManage为:
这里写图片描述

JsonConverterFactory为:
这里写图片描述

JsonResponseBodyConverter为:
这里写图片描述

这样我们可以将我们请求到的数据流转成JSONObject对象,然后再根据自己需要解析数据组装JavaBean。

  • 如何处理错误请求和异常数据

在上面的JSON截取处理中,大家可以看到我对非正常返回(小于0)的情况会抛出一个ResultException的自定义异常,然后转到Subscriber的onError中处理,还有我们在请求数据,会遇到各种错误的网络请求结果,我们可以在封装的ProgressSubscriber类中统一来处理。
ResultException类为:
这里写图片描述

ProgressSubscriber中onError()统一处理错误结果
这里写图片描述

  • 拦截器

对于我们的请求,okHttp还有很多的特点,例如请求拦截器header,动态注入cookie,加入https请求信任等等处理。这里我来简单说一下拦截器。
我们是在初始化RetrofitManage处理OkHttpClient:
这里写图片描述


总结:
上述就是我在使用RxJava+Retrofit2的时候遇到的问题,我根据自身需要来封装网络请求,大家在网上各种各样的博客中都会找到适合自己的一种方式,但是我们没有必要如何完美封装如何完美使用这那框架的,第三方的库会帮我们封装底层的一些代码,避免我们做重复多余易出错的事情,让我们专注于业务逻辑,所以学习任何一个第三方库都将是简单的,不应该复杂不该复杂的地方。
源码将会在下篇的RxJava+Retrofit2+MVP博客一起上传。谢谢大家。

阅读更多

扫码向博主提问

firejunking

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Android优化
去开通我的Chat快问
换一批

没有更多推荐了,返回首页