现在网络上面铺天盖地都是RxJava+Retrofit2的博客,还有好多大神不断地造轮子。然后在前段时间,由于项目的空档期,我就对自己现在负责的项目尝试了一下这RxJava+Retrofit2的写法,对于我来说,首先是大量地看各位大神的博客,从中不断吸取精华,在结合自己公司的后台完成的一套属于自己项目的一套网络请求。下面我只针对我的项目情况来描述我的理解。
1.Retrofit介绍
2.Gradle配置
3.简单使用Retrofit2+RxJava
4.自定义JSON解析、错误请求处理、拦截器、降低代码冗余。
Retrofit是SQUARE美国一家移动支付公司最近新发布的在Android平台上http访问的开源项目,Retrofit与okhttp共同出自于Square公司,我们在HttpClient被弃用后,在HttpURLConnection使用的期间,大家想必会发现okHttp的网络请求开源项目,然后在网络拼命搜okHttp的二次封装,然而retrofit对okhttp做了一层封装,把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了。
首先我们在Gradle文件中进行配置
然而对于RxJava和Retrofit的版本差异我就不详细描述,有兴趣的同学可以逐一去学习。
简单使用Retrofit2+RxJava
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("url")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
2. 定义请求API
@FormUrlEncoded
@POST(URLs.Login)
Observable login(@FieldMap() Map maps) ;
3. 简单使用
RetrofitManage.getInstance().getHttpServiceConnection().login(maps)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(LoginBean loginBean) {
}
});
上面的是最简单的Retrofit2+RxJava的用法,对于还处于认知阶段的同学可以参考一下,但是对于已经有一定了解的同学,上面说的可能一点用处都没有,下面我们才是本篇的重点。在Retrofit2+RxJava使用过程中,我们结合项目,其实会遇到很多不同的问题,我们应该如何再次优化、再次封装。
重复的RxJava处理,我们可以封装一个方法统一使用RxJava来处理。
另外大家都可以看到我们每一次的请求,你需要多次重复的写回调处理,我们需要再次优化。
最终效果
我们不用每一次的请求去写大量重复的代码,这样给人一种较为整洁的感觉。
这样我们可以将我们请求到的数据流转成JSONObject对象,然后再根据自己需要解析数据组装JavaBean。
在上面的JSON截取处理中,大家可以看到我对非正常返回(小于0)的情况会抛出一个ResultException的自定义异常,然后转到Subscriber的onError中处理,还有我们在请求数据,会遇到各种错误的网络请求结果,我们可以在封装的ProgressSubscriber类中统一来处理。
ResultException类为:
ProgressSubscriber中onError()统一处理错误结果
对于我们的请求,okHttp还有很多的特点,例如请求拦截器header,动态注入cookie,加入https请求信任等等处理。这里我来简单说一下拦截器。
我们是在初始化RetrofitManage处理OkHttpClient:
总结:
上述就是我在使用RxJava+Retrofit2的时候遇到的问题,我根据自身需要来封装网络请求,大家在网上各种各样的博客中都会找到适合自己的一种方式,但是我们没有必要如何完美封装如何完美使用这那框架的,第三方的库会帮我们封装底层的一些代码,避免我们做重复多余易出错的事情,让我们专注于业务逻辑,所以学习任何一个第三方库都将是简单的,不应该复杂不该复杂的地方。
源码将会在下篇的RxJava+Retrofit2+MVP博客一起上传。谢谢大家。