Android实现Rxjava2+Retrofit完美封装

去年的时候学习了RxJAVA和Retrofit的基本用法,但一直没有在实际项目中运用 。今年开做新项目,果断在新项目中引入了RxJava和Retrofit 。本篇文章将介绍笔者在项目中对Retrofit的封装 。
先来看一下封装过后的Retrofit如何使用 。
RetrofitHelper.getApiService() .getMezi() .compose(this.<List<MeiZi>>bindToLifecycle()) .compose(ProgressUtils.<List<MeiZi>>ApplyProgressBar(this)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DefaultObserver<List<MeiZi>>() { @Override public void onSuccess(List<MeiZi> response) { showToast("请求成功,妹子个数为" + response.size()); } });没错,就是这么简洁的一个链式调用,可以显示加载动画,还加入了Retrofit生命周期的管理 。
开始之前需要先在module项目里的Gradle文件中添加用到的依赖库
compile "io.reactivex.rxjava2:rxjava:$rootProject.ext.rxjava2Version" compile "com.squareup.retrofit2:retrofit:$rootProject.ext.retrofit2Version" compile "com.squareup.retrofit2:converter-scalars:$rootProject.ext.retrofit2Version" compile "com.squareup.retrofit2:converter-gson:$rootProject.ext.retrofit2Version" compile "com.squareup.retrofit2:adapter-rxjava2:$rootProject.ext.retrofit2Version" compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile "com.trello.rxlifecycle2:rxlifecycle:$rootProject.ext.rxlifecycle" //compile "com.trello.rxlifecycle2:rxlifecycle-android:$rootProject.ext.rxlifecycle" compile "com.trello.rxlifecycle2:rxlifecycle-components:$rootProject.ext.rxlifecycle"为了方便依赖库版本的修改我们采用”io.reactivex.rxjava2:rxjava:$rootProject.ext.rxjava2Version”这中方式添加依赖,因此需要在project的build.gradle文件的加上以下内容:
ext { supportLibVersion = '25.1.0' butterknifeVersion = '8.5.1' rxjava2Version = '2.0.8' retrofit2Version = '2.2.0' rxlifecycle='2.1.0' gsonVersion = '2.8.0'}下面将通过几个小节对本次封装作详细的解析:

  • 服务器响应数据的基类BasicResponse
  • 构建初始化Retrofit的工具类IdeaApi
  • 通过GsonConverterFactory获取真实响应数据
  • 封装DefaultObserver处理服务器响应
  • 处理加载Loading
  • 管理Retrofit生命周期
  • 如何使用封装
  • 小结
一.服务器响应数据的基类BasicResponse 。
假定服务器返回的Json数据格式如下:
{ "code": 200, "message": "成功", "content": { ... }}根据Json数据格式构建我们的BasicResponse(BasicResponse中的字段内容需要根据自己服务器返回的数据确定) 。代码如下:
public class BasicResponse<T> { private int code; private String message; private T content; ...此处省去get、set方法 。二.构建初始化Retrofit的工具类IdeaApi 。
该类通过RetrofitUtils来获取ApiService的实例 。代码如下:
public class IdeaApi { public static <T> T getApiService(Class<T> cls,String baseUrl) { Retrofit retrofit = RetrofitUtils .getRetrofitBuilder(baseUrl).build(); return retrofit.create(cls); }}RetrofitUtils用来构建Retrofit.Builder,并对OkHttp做以下几个方面的配置:
  1. 设置日志拦截器,拦截服务器返回的json数据 。Retrofit将请求到json数据直接转换成了实体类,但有时候我们需要查看json数据,Retrofit并没有提供直接获取json数据的功能 。因此我们需要自定义一个日志拦截器拦截json数据,并输入到控制台 。
  2. 设置Http请求头 。给OkHttp 添加请求头拦截器,配置请求头信息 。还可以为接口统一添加请求头数据 。例如,把用户名、密码(或者token)统一添加到请求头 。后续每个接口的请求头中都会携带用户名、密码(或者token)数据,避免了为每个接口单独添加 。
  3. 为OkHttp配置缓存 。同样可以同过拦截器实现缓存处理 。包括控制缓存的最大生命值,控制缓存的过期时间 。
  4. 如果采用https,我们还可以在此处理证书校验以及服务器校验 。
  5. 为Retrofit添加GsonConverterFactory 。此处是一个比较重要的环节,将在后边详细讲解 。
RetrofitUtils 代码如下:
public class RetrofitUtils { public static OkHttpClient.Builder getOkHttpClientBuilder() { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { try { LogUtils.e("OKHttp-----", URLDecoder.decode(message, "utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); LogUtils.e("OKHttp-----", message); } } }); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); File cacheFile = new File(Utils.getContext().getCacheDir(), "cache"); Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb return new OkHttpClient.Builder() .readTimeout(Constants.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS) .connectTimeout(Constants.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS) .addInterceptor(loggingInterceptor) .addInterceptor(new HttpHeaderInterceptor()) .addNetworkInterceptor(new HttpCacheInterceptor()) // .sslSocketFactory(SslContextFactory.getSSLSocketFactoryForTwoWay()) // https认证 如果要使用https且为自定义证书 可以去掉这两行注释,并自行配制证书 。// .hostnameVerifier(new SafeHostnameVerifier()) .cache(cache); } public static Retrofit.Builder getRetrofitBuilder(String baseUrl) { Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").serializeNulls().create(); OkHttpClient okHttpClient = RetrofitUtils.getOkHttpClientBuilder().build(); return new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .baseUrl(baseUrl); }}


推荐阅读