RxRetrofit 网络框架解析Word格式文档下载.docx

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

RxRetrofit 网络框架解析Word格式文档下载.docx

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

RxRetrofit 网络框架解析Word格式文档下载.docx

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

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

当前位置:首页 > PPT模板 > 商务科技

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

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