RxRetrofit 网络框架解析.docx

上传人:b****5 文档编号:6208662 上传时间:2023-01-04 格式:DOCX 页数:12 大小:144.53KB
下载 相关 举报
RxRetrofit 网络框架解析.docx_第1页
第1页 / 共12页
RxRetrofit 网络框架解析.docx_第2页
第2页 / 共12页
RxRetrofit 网络框架解析.docx_第3页
第3页 / 共12页
RxRetrofit 网络框架解析.docx_第4页
第4页 / 共12页
RxRetrofit 网络框架解析.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

RxRetrofit 网络框架解析.docx

《RxRetrofit 网络框架解析.docx》由会员分享,可在线阅读,更多相关《RxRetrofit 网络框架解析.docx(12页珍藏版)》请在冰豆网上搜索。

RxRetrofit 网络框架解析.docx

RxRetrofit网络框架解析

RxRetrofit网络框架解析

前言

网络请求在项目开发中必不可少,封装的好坏很大程度上影响的项目质量,本篇博文草民-walid与大家分享一下本人的愚见与rxretrofit框架讲解~

劣质请求框架的表现

1.与业务逻辑严重耦合

2.存在很多复杂冗余代码

3.写法不够傻瓜

4.请求统一处理不佳

rxretrofit框架介绍

技术概要

rxretrofit库采用了rxjava+retrofit2.0进行整合封装,retrofit2.0与rxjava在之前文章中都有所介绍,相信大家也都会有所了解,rxjava与retrofit的思想就不和大家进行过多的解读了,长话短说,我们开始吧~

依赖module

dependencies{

//...省略部分依赖

//rxjava相关库

compile'io.reactivex:

rxandroid:

1.2.1'

compile'io.reactivex:

rxjava:

1.1.10'

//retrofit相关库

compile'com.squareup.okhttp3:

logging-interceptor:

3.4.1'

compile'com.squareup.retrofit2:

retrofit:

2.1.0'

compile'com.squareup.retrofit2:

converter-gson:

2.1.0'

compile'com.squareup.retrofit2:

adapter-rxjava:

2.1.0'

compile'com.google.code.gson:

gson:

2.7'

}

目录结构

简单介绍下文件的作用,这里没有优先级,直接从上至下:

RetrofitParams:

配置参数,包括超时时间、转换器、拦截器等

ExceptionCode:

http异常代码

ServerResultException:

自定义server异常

ICodeVerify:

codehi合法校验接口,用于服务器code异常校验

IHttpCallback:

rxjava订阅callback

IHttpCancelListener:

http请求取消接口

IHttpResult:

http数据返回接口,统一规范

SimpleHttpCallback:

IHttpResult的实现类

RxRetrogitLog:

log日志工具类

HttpManager:

http网络请求管理

HttpSubscriber:

http订阅处理

根据目录结构大家对项目应该有了一个整体的认识。

代码解析

库中的代码整体比较简单,草民这里挑出两个重要的类来进行介绍吧~

HttpManager

/**

*Author:

walid

*Data:

2016-08-1815:

58

*Describe:

http管理类

*/

publicclassHttpManager{

privateRetrofitretrofit;

privateICodeVerifycodeVerify;

privateHttpManager(){

RxJavaPlugins.getInstance().registerErrorHandler(newRxJavaErrorHandler(){

@Override

publicvoidhandleError(Throwablee){

RxRetrogitLog.e("RxJavaPluginsError="+e);

}

});

}

publicstaticHttpManagergetInstance(){

returnHttpManager.SingletonHolder.instance;

}

privatestaticclassSingletonHolder{

staticHttpManagerinstance=newHttpManager();

}

publicvoidcreate(StringbaseUrl,ICodeVerifycodeVerify,RetrofitParamsparams){

this.codeVerify=codeVerify;

Converter.FactoryconverterFactory=params.getConverterFactory();

CallAdapter.FactorycallAdapterFactory=params.getCallAdapterFactor();

retrofit=newRetrofit.Builder().baseUrl(baseUrl)

.addConverterFactory(converterFactory!

=null?

converterFactory:

GsonConverterFactory.create(newGsonBuilder().create()))

.addCallAdapterFactory(callAdapterFactory!

=null?

callAdapterFactory:

RxJavaCallAdapterFactory.create())

.client(createClient(params))

.build();

}

privateOkHttpClientcreateClient(RetrofitParamsparams){

OkHttpClient.Builderbuilder=newOkHttpClient.Builder();

//设置超时

intconnectTimeoutSeconds=params.getConnectTimeoutSeconds();

if(connectTimeoutSeconds>0){

builder.connectTimeout(connectTimeoutSeconds,TimeUnit.SECONDS);

}

intreadTimeoutSeconds=params.getReadTimeoutSeconds();

if(readTimeoutSeconds>0){

builder.readTimeout(readTimeoutSeconds,TimeUnit.SECONDS);

}

intwriteTimeoutSeconds=params.getWriteTimeoutSeconds();

if(writeTimeoutSeconds>0){

builder.writeTimeout(writeTimeoutSeconds,TimeUnit.SECONDS);

}

//Log信息拦截器

builder.addInterceptor(newHttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));

ArrayListinterceptors=params.getInterceptors();

if(interceptors!

=null&&interceptors.size()>0){

for(Interceptorinterceptor:

interceptors){

builder.addInterceptor(interceptor);

}

}

returnbuilder.build();

}

publicApiTypegetApiService(Classtype){

returnretrofit.create(type);

}

public>HttpSubscribertoSubscribe(Observableobservable,Contextcontext,IHttpCallbacklistener){

returntoSubscribe(observable,newHttpSubscriber<>(context,listener));

}

public>HttpSubscribertoSubscribe(Observableobservable,Contextcontext,IHttpCallbacklistener,booleanisShowToast){

returntoSubscribe(observable,newHttpSubscriber<>(context,listener,isShowToast));

}

public>HttpSubscribertoSubscribe(Observableobservable,HttpSubscriberhttpSubscriber){

ObservableobservableNew=observable.map(newFunc1(){

@Override

publicTcall(Resultresult){

if(result==null){

thrownewIllegalStateException("数据为空~");

}

RxRetrogitLog.d(result.toString());

intcode=result.getCode();

if(!

codeVerify.checkValid(result.getCode())){

thrownewServerResultException(code,codeVerify.formatCodeMessage(code,result.getMsg()));

}

returnresult.getData();

}

});

observableNew.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(httpSubscriber);

returnhttpSubscriber;

}

}

重要处理:

create

rxretrofit库的初始化,建议在Application中进行初始化,通过参数可以清晰的得知,传入了baseurl、code校验与params,从而设置OkHttpClient。

getApiService

获取api的实例对象。

toSubscribe

订阅网络请求,调用此方法进行网络请求,在网络请求发起时创建了HttpSubscriber对象,进行rxjava的事件订阅,进行统一处理。

HttpSubscriber

/**

*Author:

walid

*Data:

2016-08-1815:

59

*Describe:

http观察者(订阅者)

*/

publicclassHttpSubscriberextendsSubscriberimplementsIHttpCancelListener{

privatestaticfinalStringTAG="HttpSubscriber";

//对应HTTP的状态码

privatestaticfinalintUNAUTHORIZED=401;

privatestaticfinalintFORBIDDEN=403;

privatestaticfinalintNOT_FOUND=404;

privatestaticfinalintREQUEST_TIMEOUT=408;

privatestaticfinalintINTERNAL_SERVER_ERROR=500;

privatestaticfinalintBAD_GATEWAY=502;

privatestaticfinalintSERVICE_UNAVAILABLE=503;

privatestaticfinalintGATEWAY_TIMEOUT=504;

privateContextcontext;

privateIHttpCallbackhttpCallback;

privatebooleanshowError;

publicHttpSubscriber(Contextcontext,IHttpCallbackhttpCallback){

this(context,httpCallback,true);

}

publicHttpSubscriber(Contextcontext,IHttpCallbackhttpCallback,booleanshowError){

this.context=context;

this.httpCallback=httpCallback;

this.showError=showError;

}

//订阅开始时调用

@Override

publicvoidonStart(){

}

//加载成功

@Override

publicvoidonCompleted(){

Log.d(TAG,"onCompleted");

}

//对错误进行统一处理

@Override

publicvoidonError(Throwablee){

Throwablethrowable=e;

//获取最根源的异常

while(throwable.getCause()!

=null){

e=throwable;

throwable=throwable.getCause();

}

//HTTP错误

if(einstanceofHttpException){

HttpExceptionhttpException=(HttpException)e;

switch(httpException.code()){

//权限错误,需要实现

caseUNAUTHORIZED:

caseFORBIDDEN:

callError(ExceptionCode.PERMISSION_ERROR,"权限错误~");

break;

//均视为网络错误

caseNOT_FOUND:

caseREQUEST_TIMEOUT:

caseGATEWAY_TIMEOUT:

caseINTERNAL_SERVER_ERROR:

caseBAD_GATEWAY:

caseSERVICE_UNAVAILABLE:

default:

callError(ExceptionCode.HTTP_EXCEPTION,"网络错误,请检查网络后再试~");

break;

}

}elseif(einstanceofJsonParseException||einstanceofJSONException||einstanceofParseException){

//均视为解析错误

callError(ExceptionCode.PARSE_ERROR,"数据解析异常~");

}elseif(einstanceofSocketTimeoutException){

callError(ExceptionCode.SOCKET_TIMEOUT_EXCEPTION,"网络请求超时~");

}elseif(einstanceofServerResultException){

ServerResultExceptionapiException=(ServerResultException)e;

callError(apiException.getCode(),apiException.getMessage());

}elseif(einstanceofCnnectException){

callError(ExceptionCode.CONNECT_EXCEPTION,"连接服务器失败~");

}else{

callError(ExceptionCode.UNKNOWN_ERROR,"服务器正在开小灶,请稍后再试~");

}

RxRetrogitLog.e(e.getMessage());

}

privatevoidcallError(intcode,Stringmessage){

if(showError){

Toast.makeText(context,message,Toast.LENGTH_SHORT).show();

}

if(httpCallback!

=null){

httpCallback.onError(code,message);

}

}

//将onNext方法中的返回结果交给Activity或Fragment自己处理

@Override

publicvoidonNext(Tt){

if(httpCallback==null){

return;

}

httpCallback.onNext(t);

}

//取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求

@Override

publicvoidonCancel(){

if(!

this.isUnsubscribed()){

this.unsubscribe();

}

}

}

重要处理:

onNext

请求成功回调callback。

onError

请求失败进行统一处理。

onCancel

对网络请求进行取消订阅,可以在activitydestroy中进行取消操作。

rxretrofit框架使用

前面说了那么多,有的人要吐槽了,bb这么多没有用的,说了半天我还不知道如何使用呢?

xx个逼的,草民只是想让大家不仅仅是一个使用者,更想让大家多多的懂得其中的原理,好吧!

代码我介绍的也不够完整,在此做个鬼脸,草民惭愧了,下面和大家分享重头戏,使用篇~

初始化

建议初始化在Application中~

publicclassAppextendsApplication{

@Override

publicvoidonCreate(){

super.onCreate();

//LOG日志开关

RxRetrogitLog.DEBUG=true;

RetrofitParamsparams=newRetrofitParams();

//拦截器设置

ArrayListinterceptors=newArrayList<>();

interceptors.add(newParamsInterceptor());

params.setInterceptors(interceptors);

//data转换器

GsonBuilderbuilder=newGsonBuilder().setDateFormat("yyyy-MM-ddHH:

mm:

ss");

params.setConverterFactory(GsonConverterFactory.create(builder.create()));

//连接超时时间

params.setConnectTimeoutSeconds(10);

//读取超时时间

params.setReadTimeoutSeconds(10);

//写超时时间

params.setWriteTimeoutSeconds(10);

//创建httpClient

HttpManager.getInstance().create(ApiConstants.URL,newSeaCodeVerify(),params);

}

}

api声明

publicinterfaceIInsApi{

//险种list

@GET("/api/ins/list")

Observable>>list(@Query("platform")Stringplatform);

}

请求调用

publicclassMainActivityextendsAppCompatActivity{

TextViewtvContent;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tvContent=(TextView)findViewById(R.id.tv_content);

HttpManagerhttpManager=HttpManager.getInstance();

//发起请求

httpManager.toSubscribe(httpManager.getApiService(IInsApi.class).list("ANDROID"),this,newSimpleHttpCallback>(){

@Override

publicvoidonNext(ListinsuranceVos){

tvContent.setText("Datas=\n"+insuranceVos.toString());

}

},true);

}

}

整个框架的使用就这几个最lo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

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

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