聊聊对 RxJava 与 Retrofit 的封装

目前RxJava和Retrofit结合使用已经是非常普遍了,网上关于这方面的文章也是层出不穷,其实大致的思想都是差不多的,今天我也来写一篇关于RxJava与Retrofit的文章,聊一聊关于RxJava与Retrofit的封装,尽可能的能让其适用于大部分项目,以供大家在学习这方面的时候多一份参考。

关于RxJava的基础使用可以参考我的另一篇文章:《是时候学习RxJava了》,至于Retrofit的基本使用这里我就不做介绍了,这里可以给大家提供一个学习Retrofit比较全面的网址 retrofit-getting-started-and-android-client,对Retrofit还不太熟悉的同学可以先去看看上面的系列文章。

闲话不多说了,直接上今天的主题。我们先来看看关于RxJava和Retrofit最基本的使用是怎么样的

首先我们需要去定义一个对应接口的Service和返回结果的实体类

接着再去初始化Retrofit

最后我们就可以去使用了

逻辑还是挺清晰的,但是呢,如果每次使用都让你去写这么多的代码肯定会觉得很乏味,并且这里我还没有对返回结果做错误处理,于是我们就应该考虑一下对代码封装一下了。

但是应该从哪里入手呢,这里简单分析下:

  • 看上面的代码我们会发现Retrofit初始化的那段代码,一般就一个baseUrl会有不同,其他的基本是一致的,如果我们每次去创建一个Service都要去写那么多重复的代码也大大增加了冗余度
  • 对于返回的结果一般情况下数据格式是这样的:

    code是服务器端和客户端约定好的一种规则,比如1表示数据请求成功,-1表示请求失败,-2表示权限不足等等,msg代表提示消息,其中data可能是数组对象也可能是普通的对象,我们可以考虑对返回的结果做一个统一的处理。

经过上面的分析我们大致有了一个方向,对于Service的创建应该有一个类去单独处理。所以这里我创建了一个ServiceFactory的类。

其他的代码我就不做说明了,这里我只对createService方法做一个简单的说明:对于baseUrl是用反射去获取我们自定义Service中的BASE_URL字段,所以在使用的时候就有了一个约定,当我们新建一个Service的时候一定要有BASE_URL字段并赋值。也就是说我们在新建的Service大致是这样的

现在我们应该怎样去使用呢

是不是一下感觉创建一个Service的代码一下简洁了很多。这里还没完,我们只是解决了Service的创建,还没有对结果去做处理。

我以 http://gank.io/api/data/Android/10/1 这个接口为例:
他返回的结果的格式是这样的:

所以这里我定义了这样的一个泛型类(T 是返回结果results的类型)

在处理结果的时候,其实用户只关心的是T,对其他数据可以统一处理下就比如这里的error字段,有了这个我们就可以再封装一下Subscriber了。

我们来看看现在怎么使用吧:

把这段代码与文章开始那段代码比较一下,是不是神清气爽了很多,并且这里还做了错误处理的。

细心的同学肯定注意到了这段代码,这段代码每次都是在重复的使用

这里我们可以创建一个TransformUtils类去处理一下

然后在使用的时候使用compose操作符就可以了

我们都知道对于网络请求肯定会有不成功的情况,有没有一种方案能够处理一下?其实RxJava已经为我们提供了这样的一个操作符RetryWhen可以用来实现重试机制,我这里有一个实现好的一个机制,默认情况下,最多重试3次,第一次会等3s,第二次会等6s,第三次会等9s。


到这里对于RxJava与Retrofit的封装的基本封装就差不多了,也能适用于大部分的项目中去了,一般情况下改改HttpResult和HttpResultSubscriber这两个类就可以了。
但是实际开发中有可能会遇到这样的一种情况:直接去访问一个完整的Url,还有用Retrofit去做下载该怎么做呢?

其实解决方案是有的,这里我们可以去定义一个CommonService

其实就是把参数的注解换成@Url就可以了,关于实现的细节可以参考文末给出的源码。

本文源码地址:源码

参考资料可以去我管理的专题查看:
RxJava系列专题(Android方向)

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

2 4 收藏 1 评论

关于作者:SOLID

一个Android职场新人,喜欢去探索新技术,活跃于各个技术社区,热衷于Android技术的开发与分享。会不定期的发布技术文章,用通熟易懂的的方式去分享自己学习过程中遇到的坑和开发经验,目前正在Android进阶的道路上。请多多关注我的简书博客:http://www.jianshu.com/user... 个人主页 · 我的文章 · 4 ·     

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部