RxRetrofit 网络框架解析Word格式文档下载.docx
《RxRetrofit 网络框架解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《RxRetrofit 网络框架解析Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
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!
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>
builder.readTimeout(readTimeoutSeconds,TimeUnit.SECONDS);
intwriteTimeoutSeconds=params.getWriteTimeoutSeconds();
if(writeTimeoutSeconds>
builder.writeTimeout(writeTimeoutSeconds,TimeUnit.SECONDS);
//Log信息拦截器
builder.addInterceptor(newHttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
ArrayList<
Interceptor>
interceptors=params.getInterceptors();
if(interceptors!
=null&
&
interceptors.size()>
for(Interceptorinterceptor:
interceptors){
builder.addInterceptor(interceptor);
returnbuilder.build();
public<
ApiType>
ApiTypegetApiService(Class<
type){
returnretrofit.create(type);
T,ResultextendsIHttpResult<
T>
>
HttpSubscriber<
toSubscribe(Observable<
Result>
observable,Contextcontext,IHttpCallback<
listener){
returntoSubscribe(observable,newHttpSubscriber<
(context,listener));
listener,booleanisShowToast){
(context,listener,isShowToast));
observable,HttpSubscriber<
httpSubscriber){
Observable<
observableNew=observable.map(newFunc1<
Result,T>
(){
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
59
http观察者(订阅者)
publicclassHttpSubscriber<
extendsSubscriber<
implementsIHttpCancelListener{
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;
privateIHttpCallback<
httpCallback;
privatebooleanshowError;
publicHttpSubscriber(Contextcontext,IHttpCallback<
httpCallback){
this(context,httpCallback,true);
httpCallback,booleanshowError){
this.context=context;
this.httpCallback=httpCallback;
this.showError=showError;
//订阅开始时调用
publicvoidonStart(){
//加载成功
publicvoidonCompleted(){
Log.d(TAG,"
onCompleted"
//对错误进行统一处理
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,"
网络错误,请检查网络后再试~"
}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!
httpCallback.onError(code,message);
//将onNext方法中的返回结果交给Activity或Fragment自己处理
publicvoidonNext(Tt){
if(httpCallback==null){
return;
httpCallback.onNext(t);
//取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求
publicvoidonCancel(){
this.isUnsubscribed()){
this.unsubscribe();
onNext
请求成功回调callback。
onError
请求失败进行统一处理。
onCancel
对网络请求进行取消订阅,可以在activitydestroy中进行取消操作。
rxretrofit框架使用
前面说了那么多,有的人要吐槽了,bb这么多没有用的,说了半天我还不知道如何使用呢?
xx个逼的,草民只是想让大家不仅仅是一个使用者,更想让大家多多的懂得其中的原理,好吧!
代码我介绍的也不够完整,在此做个鬼脸,草民惭愧了,下面和大家分享重头戏,使用篇~
初始化
建议初始化在Application中~
publicclassAppextendsApplication{
publicvoidonCreate(){
super.onCreate();
//LOG日志开关
RxRetrogitLog.DEBUG=true;
RetrofitParamsparams=newRetrofitParams();
//拦截器设置
interceptors=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"
)
HttpResult<
List<
InsuranceVo>
list(@Query("
platform"
)Stringplatform);
请求调用
publicclassMainActivityextendsAppCompatActivity{
TextViewtvContent;
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<
publicvoidonNext(List<
insuranceVos){
tvContent.setText("
Datas=\n"
+insuranceVos.toString());
},true);
整个框架的使用就这几个最lo