一.Rxjava2也出来了一段时间了,这段时间项目就用了一下Rxjava2和retrofit来实现了网络封装,考虑到可能存在的不为人知的bug,广大技术宅也可以提出改进意见共同进步,博主QQ:1129126470,WeChat:ym1129126470 申请请注明来意,欢迎技术交流吐槽,转载请注明出处谢谢。
二.好了废话不多说了下面给出代码不吝赐教
1.依赖库

    compile 'com.squareup.retrofit2:retrofit:2.0.0'compile 'com.squareup.retrofit2:converter-jackson:2.0.0'compile 'com.squareup.retrofit2:converter-gson:2.0.2'compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0-RC3'compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC3'compile 'io.reactivex.rxjava2:rxandroid:2.0.0-RC1'compile 'com.squareup.okhttp3:okhttp:3.2.0'compile 'com.squareup.okio:okio:1.8.0'

2.ApiInterface接口封装

public interface ApiInterface{Retrofit getRetrofit();<T> T getClientApi(Class<T> cls);
}

3.网络检查

public class AppClient {public final static boolean isNetworkReady(final Context context) {ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo ni = cm.getActiveNetworkInfo();if (ni != null) {return ni.isConnected();}return false;}public final static boolean isMobileConnected(final Context context) {ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo ni = cm.getActiveNetworkInfo();if ((null != ni) && ni.isConnected()) {return ConnectivityManager.TYPE_MOBILE == ni.getType();}return false;}}

4.缓存处理

public class CacheApi implements ApiInterface {private static Retrofit retrofit = null;private volatile static CacheApi cacheApi;private CacheApi() {}public static CacheApi getInstance() {if (cacheApi == null) {synchronized (CacheApi.class) {if (cacheApi == null) {cacheApi = new CacheApi();}}}return cacheApi;}@Overridepublic Retrofit getRetrofit() {if (retrofit == null) {OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.connectTimeout(15, TimeUnit.SECONDS);builder.readTimeout(15, TimeUnit.SECONDS);builder.writeTimeout(15, TimeUnit.SECONDS);//错误重连builder.retryOnConnectionFailure(true);File cacheFile = new File(MvpContactApplication.getInstance().getExternalCacheDir(), "MybCache");Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);Interceptor cacheInterceptor = chain -> {Request request = chain.request();if (!AppClient.isNetworkReady(MvpContactApplication.getInstance())) {request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();}Response response = chain.proceed(request);if (AppClient.isNetworkReady(MvpContactApplication.getInstance())) {int maxAge = 0;// 有网络时 设置缓存超时时间0个小时response.newBuilder().header("Cache-Control", "public, max-age=" + maxAge)//.removeHeader("")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效.build();} else {// 无网络时,设置超时为4周int maxStale = 60 * 60 * 24 * 28;response.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)//.removeHeader("nyn").build();}return response;};builder.cache(cache).addInterceptor(cacheInterceptor);//以上设置结束,才能build(),不然设置白搭OkHttpClient okHttpClient = builder.build();retrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL).client(okHttpClient).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(StringConverterFactory.create()).build();}return retrofit;}@Overridepublic <T> T getClientApi(Class<T> cls) {Retrofit retrofit = getRetrofit();return retrofit.create(cls);}
}

5.DisposableBeanSubscriber

public abstract class DisposableBeanSubscriber<T> extends DisposableSubscriber {private Class<T> cls;private Context context;private LoadingDialog loadingDialog;private boolean decode;public DisposableBeanSubscriber() {}public DisposableBeanSubscriber(Context context, Class<T> cls) {this.cls = cls;this.context = context;loadingDialog = new LoadingDialog(context);showDialog();}public DisposableBeanSubscriber(Context context, Class<T> cls, boolean decode) {this.cls = cls;this.context = context;loadingDialog = new LoadingDialog(context);showDialog();this.decode = decode;}public void showDialog() {loadingDialog.show();}public void dismissDialog() {loadingDialog.close();}@Overridepublic void onNext(Object object) {if (decode) {LogUtils.e(context, "onNext: --------decode:" + object.toString());iNext(new Gson().fromJson(CodeUtil.voteDecode(object.toString()), cls));} else {LogUtils.e(context, "onNext: ---------------" + object.toString());iNext(new Gson().fromJson(object.toString(), cls));}}@Overridepublic void onError(Throwable t) {iError();}@Overridepublic void onComplete() {iComplete();}protected abstract void iNext(T t);protected void iError() {Tos.t(context, Constant.CONNECT_ERROR);dismissDialog();}protected void iComplete() {dismissDialog();}
}

6.正常的链接网络流程

public class NormalApi implements ApiInterface {private static Retrofit retrofit = null;private volatile static NormalApi normalApi;private NormalApi() {}public static NormalApi getInstance() {if (normalApi == null) {synchronized (NormalApi.class) {if (normalApi == null) {normalApi = new NormalApi();}}}return normalApi;}@Overridepublic Retrofit getRetrofit() {OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.connectTimeout(15, TimeUnit.SECONDS);builder.readTimeout(15, TimeUnit.SECONDS);builder.writeTimeout(15, TimeUnit.SECONDS);builder.retryOnConnectionFailure(true);OkHttpClient okHttpClient = builder.build();retrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL).client(okHttpClient).addConverterFactory(StringConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();return retrofit;}@Overridepublic <T> T getClientApi(Class<T> t) {Retrofit retrofit = getRetrofit();return retrofit.create(t);}
}

7.下面借助我耿哥封装的思路封装StringConverterFactory

public class StringConverterFactory extends Converter.Factory {public static StringConverterFactory create() {return new StringConverterFactory();}private StringConverterFactory() {}@Overridepublic Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,Retrofit retrofit) {return new StringResponseBodyConverter();}@Overridepublic Converter<?, RequestBody> requestBodyConverter(Type type,Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {return new StringRequestBodyConverter();}
}

8.请求封装StringRequestBodyConverter

public class StringRequestBodyConverter  implements Converter<String, RequestBody> {private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");private static final Charset UTF_8 = Charset.forName("UTF-8");StringRequestBodyConverter() {}@Override public RequestBody convert(String value) throws IOException {Buffer buffer = new Buffer();Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);writer.write(value);writer.close();return RequestBody.create(MEDIA_TYPE, buffer.readByteString());}
}

9.响应

public class StringResponseBodyConverter implements Converter<ResponseBody, String> {@Overridepublic String convert(ResponseBody value) throws IOException {try {return value.string();} finally {value.close();}}
}

10RxBus相关(相当于EventBus时间总线)

public class RxBus {//相当于Rxjava1.x中的Subjectprivate final FlowableProcessor<Object> mBus;private static volatile RxBus sRxBus = null;private RxBus() {//调用toSerialized()方法,保证线程安全mBus = PublishProcessor.create().toSerialized();}public static synchronized RxBus getDefault() {if (sRxBus == null) {synchronized (RxBus.class) {if (sRxBus == null) {sRxBus = new RxBus();}}}return sRxBus;}/*** 发送消息* @param o*/public void post(Object o) {new SerializedSubscriber<>(mBus).onNext(o);}/*** 确定接收消息的类型* @param aClass* @param <T>* @return*/public <T> Flowable<T> toFlowable(Class<T> aClass) {return mBus.ofType(aClass);}/*** 判断是否有订阅者* @return*/public boolean hasSubscribers() {return mBus.hasSubscribers();}
}

11.RxBusHelper的封装

public class RxBusHelper {/*** 发布消息** @param o*/public static void post(Object o) {RxBus.getDefault().post(o);}/*** 接收消息,并在主线程处理** @param aClass* @param disposables 用于存放消息* @param listener* @param <T>*/public static <T> void doOnMainThread(Class<T> aClass, CompositeDisposable disposables, OnEventListener<T> listener) {disposables.add(RxBus.getDefault().toFlowable(aClass).observeOn(AndroidSchedulers.mainThread()).subscribe(listener::onEvent, throwable -> listener.onError(new ErrorBean(ErrorCode.ERROR_CODE_RXBUS, ErrorCode.ERROR_DESC_RXBUS))));}public static <T> void doOnMainThread(Class<T> aClass, OnEventListener<T> listener) {RxBus.getDefault().toFlowable(aClass).observeOn(AndroidSchedulers.mainThread()).subscribe(listener::onEvent, throwable ->listener.onError(new ErrorBean(ErrorCode.ERROR_CODE_RXBUS, ErrorCode.ERROR_DESC_RXBUS)));}/*** 接收消息,并在子线程处理** @param aClass* @param disposables* @param listener* @param <T>*/public static <T> void doOnChildThread(Class<T> aClass, CompositeDisposable disposables, OnEventListener<T> listener) {disposables.add(RxBus.getDefault().toFlowable(aClass).subscribeOn(Schedulers.newThread()).subscribe(listener::onEvent, throwable -> listener.onError(new ErrorBean(ErrorCode.ERROR_CODE_RXBUS, ErrorCode.ERROR_DESC_RXBUS))));}public static <T> void doOnChildThread(Class<T> aClass, OnEventListener<T> listener) {RxBus.getDefault().toFlowable(aClass).subscribeOn(Schedulers.newThread()).subscribe(listener::onEvent, throwable -> listener.onError(new ErrorBean(ErrorCode.ERROR_CODE_RXBUS, ErrorCode.ERROR_DESC_RXBUS)));}public interface OnEventListener<T> {void onEvent(T t);void onError(ErrorBean errorBean);}
}

有什么指教的,请留言或者私信给我,我看到了及时回复。

RxJava2+retrofit实现网络封装相关推荐

  1. java如何把方法封装成接口,RxJava配合Retrofit实现网络封装

    那么呢,首先呢,我们呢,来记录一下Android中比较火的两种技术,火了大半壁江山的RxJava和垄断了大部分的网络请求Retrofit.这两者的结合其实不需要太多的封装,只要简简单单的搞两下子基本就 ...

  2. java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装

    概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...

  3. MVVM+Retrofit+Kotlin网络框架封装

    上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...

  4. MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。

    MVP+Dragger2+Rxjava2+Retrofit+OKhttp框架已经流行很长时间,而且也必将成为未来android开发的趋势,在使用这个框架的过程中踩过很多坑, 所以想把我的经验告诉大家, ...

  5. Retrofit的网络框架介绍

    Retrofit简介 Retrofit是square开源的网络请求库,底层是使用OKHttp封装的,网络请求速度很快. 主要有一下几种请求方法 格式 含义 @GET 表示这是一个GET请求 @POST ...

  6. 模仿开眼的视频APP,基于MVP+rxjava2+Retrofit+Dagger2+Glide+Realm+GSYVideoPlayer

    EyesOpener EyesOpener,一款开眼高仿APP, 基于 MVP+rxjava2+Retrofit+![Dagger2](https://img-blog.csdn.net/201806 ...

  7. 网络封装 - 收藏集 - 掘金

    打造安卓 App 丝滑的操作体验--Fragment 深入使用和封装之道 - Android - 掘金 简介 想让App有丝滑般的切换速度和顺畅的体验么?那就放开Activity,使用Fragment ...

  8. (三)Rxjava2+Retrofit之文件上传与下载

    结合 第一篇文章对Retrofit的封装,本篇文章将讲述如何实现文件上传与下载.本篇文章可分为文件上传与文件下载两部分内容. 一.使用RxJava+Retrofit上传文件 使用Retrofit上传文 ...

  9. Android中使用Kotlin协程(Coroutines)和Retrofit进行网络请求(二)之文件下载

    写在前面 下载功能是非常常用的功能,今天我们要通过kotlin协程和retrofit来是实现文件下载的功能.retorfit本身可以将请求结果以InputStream的形式返回,拿到InputStre ...

  10. Rxjava Disposable解除订阅(Retrofit2+Rxjava2主动取消网络请求)

    Disposable类 dispose():主动解除订阅(如果使用Retrofit2+Rxjava2,调用dispose会主动取消网络请求,在本文的后半部分) isDisposed():查询是否解除订 ...

最新文章

  1. ARM--MDK5 Software Packs下载
  2. explode() 字符串转换数组
  3. Ubuntu12下安装redis(多图版)+ Jedis连接Redis
  4. hana studio版本和hana版本的区别
  5. P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】
  6. STM32----摸石头过河系列(四)
  7. Spring自学日志00(Spring配置文件头及xsd文件版本浅析)
  8. ELK入门级介绍--打造实时日志查询系统
  9. lxc设置网络为公网IP
  10. [译]Javascript中的mutators
  11. 清华大学电机学答案_电机学清华大学答案
  12. 三星 smarttv android,三星SmartView
  13. Android签名概要总结——对称加密/非对称加密、数字签名、公钥证书、ca认证机构、安卓app签名
  14. linux 查看日志最后100行
  15. npm安装vue报错:npm ERR! code ETIMEDOUT
  16. 2022年最新常用的浏览器排行榜单
  17. DTT的生活就是对吃的一种细细品味
  18. 计算机关于剪贴板的知识,复制、剪切、粘贴与剪贴板、内存的关系
  19. ORACLE取当天七点半
  20. latex插入图片之后图片后面的文字跑到前面来了怎么办

热门文章

  1. 关于Mysql的mysql.sock文件
  2. 全场景效能平台猪齿鱼 Agent——helm组件升级
  3. 网络与信息安全方向顶刊顶会
  4. 华为热设计工程师待遇_【华为热设计工程师面试】华为的面试是我面试过程中相对简单的一个。-看准网...
  5. 抖音开放平台开发记录
  6. linux 删除回收站文件,浅析linux下的回收站以及U盘中的.Trash文件夹
  7. NTFS文件系统下的删除
  8. 计算机设置成一个网络,怎样将笔记本电脑设置成一个wifi热点
  9. Web前端工程师推荐的书籍
  10. java gdal开源库_基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版