ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:96.30KB ,
资源ID:6326408      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6326408.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(RxJava+Retrofit+OkHttp深入浅出终极封装六特殊篇变种String替换Gson自由扩展.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

RxJava+Retrofit+OkHttp深入浅出终极封装六特殊篇变种String替换Gson自由扩展.docx

1、RxJava+Retrofit+OkHttp深入浅出终极封装六特殊篇变种String替换Gson自由扩展RxJava+Retrofit+OkHttp深入浅出-终极封装六特殊篇(变种String替换Gson自由扩展)通过传统的GsonConverterFactory自动解析,这样做确实很方便,用户能直接获取返回的对象,不用关心具体的转换,但是:这随之而来有很多的缺陷(虽然官网推荐这样使用);比如:无法使用其他第三发转换框架;泛型无法中间传递,封装无法统一处理缓存结果;回调信息无法统一处理;服务器返回格式不严谨null解析异常. 所以我们在享受它遍历的同时也被迫的要限制做很多的处理,限制我们的扩展

2、!本章就介绍如何放弃GsonConverterFactory,直接返回String,扩展我们的封装!(封装的整体思想和之前的封装一样,所以不会有大的改动!)无须担心,本篇封装单独作为一个项目和之前封装分开,便于大家选择!功能完全具备和之前封装一样的功能,这里改用fastjson处理 1.Retrofit+Rxjava+okhttp基本使用方法 2.统一处理请求数据格式 3.统一的ProgressDialog和回调Subscriber处理 4.取消http请求 5.预处理http请求 6.返回数据的统一判断 7.失败后的retry处理 8.RxLifecycle管理生命周期,防止泄露 9.文件上

3、传下载(支持多文件,断点续传) 10.Cache数据持久化和数据库(greenDao)两种缓存机制 11.一对多回调接口处理对比话说没有比较就没有进步,所以大家比较下前后封装的各自的优缺点,自行选择合适自己的方案!使用Gson方案: / 完美封装简化版 private void simpleDo() SubjectPostApi postEntity = new SubjectPostApi(simpleOnNextListener,this); postEntity.setAll(true); HttpManager manager = HttpManager.getInstance();

4、manager.doHttpDeal(postEntity); / 回调一一对应 HttpOnNextListener simpleOnNextListener = new HttpOnNextListenerList() Override public void onNext(List subjects) tvMsg.setText(网络返回:n + subjects.toString(); Override public void onCacheNext(String cache) /*缓存回调*/ Gson gson=new Gson(); java.lang.reflect.Type

5、type = new TypeTokenBaseResultEntityList() .getType(); BaseResultEntity resultEntity= gson.fromJson(cache, type); tvMsg.setText(缓存返回:n+resultEntity.getData().toString() ); /*用户主动调用,默认是不需要覆写该方法*/ Override public void onError(Throwable e) super.onError(e); tvMsg.setText(失败:n + e.toString(); /*用户主动调用,默

6、认是不需要覆写该方法*/ Override public void onCancel() super.onCancel(); tvMsg.setText(取消請求); ;String方案 / 完美封装简化版 private void simpleDo() /*初始化数据*/ manager=new HttpManager(this,this); postEntity = new SubjectPostApi(); postEntity.setAll(true); manager.doHttpDeal(postEntity); Override public void onNext(String

7、 resulte, String mothead) /*post返回处理*/ if(mothead.equals(postEntity.getMothed() List subjectResulte= JSONObject.parseArray(resulte,SubjectResulte.class); tvMsg.setText(post返回:n+subjectResulte.toString() ); /*上传返回处理*/ if(mothead.equals(uplaodApi.getMothed() UploadResulte uploadResulte=JSONObject.pars

8、eObject(resulte,UploadResulte.class); tvMsg.setText(上传成功返回:n+uploadResulte.getHeadImgUrl(); Glide.with(MainActivity.this).load(uploadResulte.getHeadImgUrl().skipMemoryCache(true).into(img); Override public void onError(Throwable e) tvMsg.setText(失败:n + e.toString(); Gson封装方案中,我们采用了一一对应的返回原则,将所以的请求数据

9、参数都放入到baseApi中,返回放入对应的HttpOnNextListener 中 String方案中我们则采用一对多原则,将回调和请求分开处理,公用一个回调,通过回调中的mothead来区分不同的接口,所以上述可以看见后者里面其实还处理了上传的回调处理!从封装的用法上可以看出: 优点:String封装更加的灵活,可以指定Gson转换的第三方工具,统一的结果返回处理代码更加的少(可以完美解决缓存无法统一回调的问题); 同样也有缺点:String封装无法自动解析结果类型,需要手动处理(我反而觉得这也是它的优点,更加的灵活,个人看法)1.替换GsonConverterFactory由于GsonC

10、onverterFactory会自动解析Gson,替换成直接返回String的ScalarsConverterFactory 导入相关包(为了区别-使用fastjson可自由扩展) compile com.squareup.retrofit2:converter-scalars:+ compile com.alibaba:fastjson:+替换 compile com.squareup.retrofit2:converter-gson:+ compile com.google.code.gson:gson:+2.修改retrofit构建ScalarsConverterFactory替换Gso

11、nConverterFactory /*创建retrofit对象*/ Retrofit retrofit = new Retrofit.Builder() .client(builder.build() .addConverterFactory(ScalarsConverterFactory.create() .addCallAdapterFactory(RxJavaCallAdapterFactory.create() .baseUrl(basePar.getBaseUrl() .build(); HttpService httpService = retrofit.create(HttpS

12、ervice.class);替换 /*创建retrofit对象*/ Retrofit retrofit = new Retrofit.Builder() .client(builder.build() .addConverterFactory(GsonConverterFactory.create() .addCallAdapterFactory(RxJavaCallAdapterFactory.create() .baseUrl(basePar.getBaseUrl() .build(); HttpService httpService = retrofit.create(HttpServi

13、ce.class);3.修改缓存记录位置由于之前是为了防止gson重复解析,将缓存放入到自定义CookieInterceptor中;既然现在不需要自动转换,直接返回String,所以直接将缓存数据处理放入到ProgressSubscriber的onNext中处理;修改1:去掉CookieInterceptor /手动创建一个OkHttpClient并设置超时时间缓存等设置 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.addInterceptor(new CacheInterceptor(); builde

14、r.addNetworkInterceptor(new CacheInterceptor();替换 /手动创建一个OkHttpClient并设置超时时间缓存等设置 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.addNetworkInterceptor(new CacheInterceptor(); builder.addInterceptor(new CookieInterceptor(basePar.isCache();修改二:实现缓存处理 在onNext中实现缓存处理 /* * 将onNext方法中的

15、返回结果交给Activity或Fragment自己处理 * * param t 创建Subscriber时的泛型类型 */ Override public void onNext(T t) /*缓存处理*/ if(api.isCache() CookieResulte resulte= CookieDbUtil.getInstance().queryCookieBy(api.getUrl(); long time=System.currentTimeMillis(); /*保存和更新本地数据*/ if(resulte=null) resulte =new CookieResulte(api.g

16、etUrl(),t.toString(),time); CookieDbUtil.getInstance().saveCookie(resulte); else resulte.setResulte(t.toString(); resulte.setTime(ime); CookieDbUtil.getInstance().updateCookie(resulte); if (mSubscriberOnNextListener.get() != null) mSubscriberOnNextListener.get().onNext(String) t,api.getMothed(); 4.修

17、改回调接口信息由于现在通过String直接返回,所以可以将成功回调和缓存回调合并处理;另一方面没有了泛型的限制,在回调时可以通过接口请求参数实现一对多回调处理;/* * 成功回调处理 * Created by WZG on 2016/7/16. */public interface HttpOnNextListener /* * 成功后回调方法 * param resulte * param method */ void onNext(String resulte,String method); /* * 失败或者错误方法 * 主动调用,更加灵活 * param e */ void onErr

18、or(Throwable e);5.修改BaseApi由于取消了泛型返回的机制,所以在Func1判断时需要手动转换数据;这里示例fastjeson用法转换 Override public String call(T httpResult) BaseResultEntity baseResulte= JSONObject.parseObject(httpResult.toString(),BaseResultEntity.class); if (baseResulte.getRet() = 0) throw new HttpTimeException(baseResulte.getMsg();

19、return baseResulte.getData(); 替换 Override public T call(BaseResultEntity httpResult) if (httpResult.getRet() = 0) throw new HttpTimeException(httpResult.getMsg(); return httpResult.getData(); 6.修改结果基础类BaseResultEntity将泛型数据改成String数据类型/* * 回调信息统一封装类 * Created by WZG on 2016/7/16. */public class BaseR

20、esultEntity / 判断标示 private int ret; / 提示信息 private String msg; /显示数据(用户需要关心的数据) private String data; 替换/* * 回调信息统一封装类 * Created by WZG on 2016/7/16. */public class BaseResultEntity / 判断标示 private int ret; / 提示信息 private String msg; /显示数据(用户需要关心的数据) private T data; 7.合并缓存和成功回到返回处理由于取消泛型,缓存和成统一处理所以需要修

21、改 /* * 订阅开始时调用 * 显示ProgressDialog */ Override public void onStart() showProgressDialog(); /*缓存并且有网*/ if(api.isCache()& AppUtil.isNetworkAvailable(MyApplication.app) /*获取缓存数据*/ CookieResulte cookieResulte= CookieDbUtil.getInstance().queryCookieBy(api.getUrl(); if(cookieResulte!=null) long time= (Syst

22、em.currentTimeMillis()-cookieResulte.getTime()/1000; if(time api.getCookieNetWorkTime() if( mSubscriberOnNextListener.get()!=null) mSubscriberOnNextListener.get().onNext(cookieResulte.getResulte(),api.getMothed(); onCompleted(); unsubscribe(); 替换 /* * 订阅开始时调用 * 显示ProgressDialog */ Override public vo

23、id onStart() showProgressDialog(); /*缓存并且有网*/ if(api.isCache()& AppUtil.isNetworkAvailable(MyApplication.app) /*获取缓存数据*/ CookieResulte cookieResulte= CookieDbUtil.getInstance().queryCookieBy(api.getUrl(); if(cookieResulte!=ull) long time= (System.currentTimeMillis()-cookieResulte.getTime()/1000; if(

24、time api.getCookieNetWorkTime() if( mSubscriberOnNextListener.get()!=null) mSubscriberOnNextListener.get().onCacheNext(cookieResulte.getResulte(); onCompleted(); unsubscribe(); 8.修改一对多回调处理没有了泛型,可以修改HttpManager,采用动态创建,动态回调的方法解决多嵌套耦合的问题 修改1:去掉默认构造传参 public BaseApi(HttpOnNextListener listener, RxAppCom

25、patActivity rxAppCompatActivity) setListener(listener); setRxAppCompatActivity(rxAppCompatActivity); setShowProgress(true); setCache(true); 修改2:添加HttpManager动态传参/* * http交互处理类 * Created by WZG on 2016/7/16. */public class HttpManager /*弱引用對象*/ private SoftReference onNextListener; private SoftRefere

26、nce appCompatActivity; public HttpManager(HttpOnNextListener onNextListener, RxAppCompatActivity appCompatActivity) this.onNextListener=new SoftReference(onNextListener); this.appCompatActivity=new SoftReference(appCompatActivity); * *修改3:通过method动态判断接口返回public class MainActivity extends RxAppCompat

27、Activity implements HttpOnNextListener Override public void onNext(String resulte, String method) /*post返回处理*/ if(method.equals(postEntity.getMothed() * /*上传返回处理*/ if(method.equals(uplaodApi.getMothed() * Override public void onError(Throwable e) tvMsg.setText(失败:n + e.toString(); 大功告成!下载模块由于下载模块是独立

28、存在,所以基本没有修改,唯一修改的地方就是将HttpDownManager中的GsonConverterFactory替换成ScalarsConverterFactory即可!总结通过自定义String类型的返回处理方式,有效的解决了之前Gson自动转换的问题1.一对一返回问题(代码量多)2.缓存回调无法和成功统一处理3.无法指定gson转换第三方库4.回调监听的多嵌套(耦合度大)5.解决服务器数据null异常注意:这里只是给大家提供了一个不同的解决方案,Gson自动解析返回的方案也是有它的优点,可以大大的减少开发的工作量,优缺点也很明显;孰好孰坏自行判断,自行选择适合自己的方案(个人偏向后者String返回,比较灵活)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1