RxJava2+retrofit实现网络封装
一.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实现网络封装相关推荐
- java如何把方法封装成接口,RxJava配合Retrofit实现网络封装
那么呢,首先呢,我们呢,来记录一下Android中比较火的两种技术,火了大半壁江山的RxJava和垄断了大部分的网络请求Retrofit.这两者的结合其实不需要太多的封装,只要简简单单的搞两下子基本就 ...
- java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装
概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...
- MVVM+Retrofit+Kotlin网络框架封装
上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...
- MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
MVP+Dragger2+Rxjava2+Retrofit+OKhttp框架已经流行很长时间,而且也必将成为未来android开发的趋势,在使用这个框架的过程中踩过很多坑, 所以想把我的经验告诉大家, ...
- Retrofit的网络框架介绍
Retrofit简介 Retrofit是square开源的网络请求库,底层是使用OKHttp封装的,网络请求速度很快. 主要有一下几种请求方法 格式 含义 @GET 表示这是一个GET请求 @POST ...
- 模仿开眼的视频APP,基于MVP+rxjava2+Retrofit+Dagger2+Glide+Realm+GSYVideoPlayer
EyesOpener EyesOpener,一款开眼高仿APP, 基于 MVP+rxjava2+Retrofit+![Dagger2](https://img-blog.csdn.net/201806 ...
- 网络封装 - 收藏集 - 掘金
打造安卓 App 丝滑的操作体验--Fragment 深入使用和封装之道 - Android - 掘金 简介 想让App有丝滑般的切换速度和顺畅的体验么?那就放开Activity,使用Fragment ...
- (三)Rxjava2+Retrofit之文件上传与下载
结合 第一篇文章对Retrofit的封装,本篇文章将讲述如何实现文件上传与下载.本篇文章可分为文件上传与文件下载两部分内容. 一.使用RxJava+Retrofit上传文件 使用Retrofit上传文 ...
- Android中使用Kotlin协程(Coroutines)和Retrofit进行网络请求(二)之文件下载
写在前面 下载功能是非常常用的功能,今天我们要通过kotlin协程和retrofit来是实现文件下载的功能.retorfit本身可以将请求结果以InputStream的形式返回,拿到InputStre ...
- Rxjava Disposable解除订阅(Retrofit2+Rxjava2主动取消网络请求)
Disposable类 dispose():主动解除订阅(如果使用Retrofit2+Rxjava2,调用dispose会主动取消网络请求,在本文的后半部分) isDisposed():查询是否解除订 ...
最新文章
- ARM--MDK5 Software Packs下载
- explode() 字符串转换数组
- Ubuntu12下安装redis(多图版)+ Jedis连接Redis
- hana studio版本和hana版本的区别
- P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】
- STM32----摸石头过河系列(四)
- Spring自学日志00(Spring配置文件头及xsd文件版本浅析)
- ELK入门级介绍--打造实时日志查询系统
- lxc设置网络为公网IP
- [译]Javascript中的mutators
- 清华大学电机学答案_电机学清华大学答案
- 三星 smarttv android,三星SmartView
- Android签名概要总结——对称加密/非对称加密、数字签名、公钥证书、ca认证机构、安卓app签名
- linux 查看日志最后100行
- npm安装vue报错:npm ERR! code ETIMEDOUT
- 2022年最新常用的浏览器排行榜单
- DTT的生活就是对吃的一种细细品味
- 计算机关于剪贴板的知识,复制、剪切、粘贴与剪贴板、内存的关系
- ORACLE取当天七点半
- latex插入图片之后图片后面的文字跑到前面来了怎么办
热门文章
- 关于Mysql的mysql.sock文件
- 全场景效能平台猪齿鱼 Agent——helm组件升级
- 网络与信息安全方向顶刊顶会
- 华为热设计工程师待遇_【华为热设计工程师面试】华为的面试是我面试过程中相对简单的一个。-看准网...
- 抖音开放平台开发记录
- linux 删除回收站文件,浅析linux下的回收站以及U盘中的.Trash文件夹
- NTFS文件系统下的删除
- 计算机设置成一个网络,怎样将笔记本电脑设置成一个wifi热点
- Web前端工程师推荐的书籍
- java gdal开源库_基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版