RxJavaRetrofitMVP.docx

上传人:b****0 文档编号:9752658 上传时间:2023-05-21 格式:DOCX 页数:11 大小:18.42KB
下载 相关 举报
RxJavaRetrofitMVP.docx_第1页
第1页 / 共11页
RxJavaRetrofitMVP.docx_第2页
第2页 / 共11页
RxJavaRetrofitMVP.docx_第3页
第3页 / 共11页
RxJavaRetrofitMVP.docx_第4页
第4页 / 共11页
RxJavaRetrofitMVP.docx_第5页
第5页 / 共11页
RxJavaRetrofitMVP.docx_第6页
第6页 / 共11页
RxJavaRetrofitMVP.docx_第7页
第7页 / 共11页
RxJavaRetrofitMVP.docx_第8页
第8页 / 共11页
RxJavaRetrofitMVP.docx_第9页
第9页 / 共11页
RxJavaRetrofitMVP.docx_第10页
第10页 / 共11页
RxJavaRetrofitMVP.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

RxJavaRetrofitMVP.docx

《RxJavaRetrofitMVP.docx》由会员分享,可在线阅读,更多相关《RxJavaRetrofitMVP.docx(11页珍藏版)》请在冰点文库上搜索。

RxJavaRetrofitMVP.docx

RxJavaRetrofitMVP

MVP:

Model:

控制层

View:

视图层,一般由activity或者fragment继承

Presenter:

中间调节层,一般在activity或者fragment中创建presenter对象,在presenter中对model和view进行操作。

Bean:

实体类

Bean:

PublicclassUser{

@SerializedName("user_name")

Privatestringname;

@SerializedName("user_age")

Privatestringage

Get,set方法设置

}

View:

视图类

一般是接口,只有方法没有实现,主要就是对activity或者fragment中的内容,比如

ShowProgress;

HideProgress;

UpdateList;

然后让fragment或者activity实现此接口

Model:

实现类

创建ShadowModel接口,里面包含需要实现的方法,getSegmentList();

创建ShadowModelImpl类,实现ShadowMod接口,实现接口的方法。

因为此次介绍是使用的retrofit+rxjava的实现网络访问,所以我们另外创建两个类别:

ApiManger类:

publicstaticFilehttpCacheDirectory=newFile(MyApplication.getContext().getCacheDir(),"shadow");

privatestaticintcacheSize=10*1024*1024;//10MiB缓存大小

privatestaticCachecache=newCache(httpCacheDirectory,cacheSize);创建缓存对象

Interceptor是拦截器,在发送之前,添加一些公共参数,或者获取一些信息。

privatestaticfinalInterceptorREWRITE_CACHE_CONTROL_INTERCEPTOR=newInterceptor(){

@Override创建拦截器

publicResponseintercept(Chainchain)throwsIOException{

Requestrequest=chain.request();

if(!

NetWorkUtil.isNetWorkAvailable(MyApplication.getContext())){

request=request.newBuilder()

.cacheControl(CacheControl.FORCE_CACHE)

.build();

}

ResponseoriginalResponse=chain.proceed(request);

if(NetWorkUtil.isNetWorkAvailable(MyApplication.getContext())){

intmaxAge=60;//在线缓存在1分钟内可读取

returnoriginalResponse.newBuilder()

.removeHeader("Pragma")

.removeHeader("Cache-Control")

.header("Cache-Control","public,max-age="+maxAge)

.build();

}else{

intmaxStale=60*60*24*28;//离线时缓存保存4周

returnoriginalResponse.newBuilder()

.removeHeader("Pragma")

.removeHeader("Cache-Control")

.header("Cache-Control","public,only-if-cached,max-stale="+maxStale)

.build();

}

}

};

publicstaticOkHttpClientclient=newOkHttpClient.Builder()

.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)

.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)

.cache(cache)

.build();

publicstaticApiManageapiManage;

publicstaticApiManagegetInstence(){

if(apiManage==null){

synchronized(ApiManage.class){

if(apiManage==null){

apiManage=newApiManage();

}

}

}

returnapiManage;

}

ShadowApi接口:

publicinterfaceShadowApi{

@GET("/api/4/news/latest")

ObservablegetLastDaily();

@GET("/api/4/news/{id}")

ObservablegetZhihuStory(@Path("id")Stringid);

}

 

Retrofit有很多注解,GETPOSTDELETE等等主要是说请求方式

1.@GET("/api/4/news/latest")===http:

//news-/api/4/news/latest

ObservablegetLastDaily();

2.@GET("/api/4/news/before/{date}")http:

//news-/api/4/news/before?

date=date

ObservablegetTheDaily(@Path("date")Stringdate);

3.@GET("/api/4/news/{id}")http:

//news-/api/4/news?

id=id

ObservablegetZhihuStory(@Path("id")Stringid);

4.@GET("/weather")多个参数请求

ObservablegetWeather(@Query("q")Stringplace,@Query("units")Stringunits);

5.@GET("applist/apps/detail")参数不固定的时候

CallgetDetail(@QueryMapMapparam);

6.@GET("applist/apps/detail?

type=detail")静态参数,动态参数混合使用

CallgetDetail(@Query("appid")Stringappid);

7.@Headers("Accept-Encoding:

application/json")
固定添加header,但是一般都是写个拦截器,在httpclient中进行设置

@GET("applist/apps/detail?

type=detail")

CallgetDetail(@Query("appid")Stringappid);

8.@Headers({多个header的时候

"X-Foo:

Bar",

"X-Ping:

Pong"

})

POST请求不能把数据放在URL中,需要放在请求体中,所以我们可以这样做:

1.@POST("/login/")

Observablelogin(post(@BodyUseruser);

User是个对象,所以我们在传递参数的时候需要传递一个对象过来。

2.通过@Field来指定key,后面跟上value

@FormUrlEncoded

@POST("/newfind/index_ask")

ObservablegetDaJia(@Field("page")intpage,

@Field("pageSize")intsize,

@Field("tokenMark")longtokenMark,

@Field("token")Stringtoken

);

3.请求体过多,采用map传递参数,直接传过来封装好的map即可

@FormUrlEncoded

@POST("FundPaperTrade/AppUserLogin")

ObservablegetTransData(@FieldMapMapmap);

以上三种请求都是以键值对形式去请求,但是一般项目中post请求除了键值对,也还会遇到json、xml的请求,后台也做了约束,约束其上传格式为json/xml,无默认(防止不认识上传的东东),所以一般要添加头文件(测试必须得用fiddle,可减少一大半时间,悔~)

下面谈谈如何添加头文件,第一种方式直接在api中请求方式之上添加,如下:

1.@Headers({"Content-type:

application/json",

"Content-Length:

59"})*/

@POST("FundPaperTrade/AppUserLogin")

ObservablegetTransData(@BodyTestBeanstr);

2.为了方便使用可以写个拦截器,为每个请求都添加header,下面的APImanager进行的详细的设置

publicclassHttpInterceptorimplementsInterceptor{

@Override

publicResponseintercept(Chainchain)throwsIOException{

Request.Builderbuilder=chain.request().newBuilder();

Requestrequst=builder.addHeader("Content-type","application/json").build();

returnchain.proceed(requst);

}

}

最后配置网络处加入

client.interceptors().add(newHttpInterceptor());

一定要注意用json上传,@Body中千万不能写String类型,否则会导致请求体构造错误(json格式不正确,多出\),正确写法如下:

@POST("FundPaperTrade/AppUserLogin")

ObservablegetTransData(@BodyTestBeanstr);//实体对象

ShadowModelImpl:

PrivateObjectobject=newObject();

PrivateShadowApishadowApi;

publicShadowApigetShadowApiService(){

if(shadowApi==null){

synchronized(object){

if(shadowApi==null){

shadowApi=newRetrofit.Builder()

.baseUrl("http:

//news-")

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.client(ApiManage.client)

.addConverterFactory(GsonConverterFactory.create())

.build()

.create(shadowApi.class);

}

}

}

returnshadowApi;

}

Presenter:

实现model和view之间的联系,model负责获取数据,view负责处理数据。

RxJava网络访问,调度容易引起内存泄漏,所以一般写个BasePresenter接口,用于处理所以的subscription;

PublicinterfaceBasePresenter{

Voidunsubscribe();

}

BasePresenterImpl实现BasePresenter接口

PublicclassBasePresenterImplementimplementsBasePresenter{

//获取所有的观察者集合

PrivateCompositeSubscriptioncompositeSubscription;

PublicvoidaddSubcription(Subcriptions){

if(this.mCompositeSubscription==null){

this.mCompositeSubscription=newCompositeSubscription();

}

this.mCompositeSubscription.add(s);

}

//实现接口的方法,一般在ondestroy中调用,销毁

Publicvoidunsubscribe(){

mCompoditeSubscription.unsubscribe();

}

}

基类配置完成,下面就需要配置需要的presenter

创建接口ShadowPresenter,要实现的方法是加载网络列表数据

getSegmentList();

创建类ShadowPresenterImpl实现ShadowPresenter继承BasePresenterImpl

在构造方法中对view和model进行初始化操作。

PrivateShadowViewshadowView;

PrivateShadowModelshadowModel;

PublicShadowPresenterImpl(ShadowViewview){

shadowView=view;//因为activity继承shadowview,所以直接传过来即可

shadowModel=newshadowModelmpl();}

然后实现ShadowPresenter接口的方法,getSegmentList();

@Override

publicvoidgetSegmentList(){

shadowView.showProgressDialog();

Subscriptionsubscription=shadowMode.getShadowApiService().getShadowApi()

.map(newFunc1(){

@Override

publicObjectcall(Objectobject)

returnobject;

}

})

.subscribeOn(Schedulers.io())线程调度

.observeOn(AndroidSchedulers.mainThread())切换主线程

//两种方式来处理返回的数据

1---.subscribe(newAction1(){

@Override

publicvoidcall(Shadowshadow){

}

});

2---.subscribe(newObserver(){

@Override

publicvoidonCompleted(){

}

@Override

publicvoidonError(Throwablee){

mZhihuFragment.hidProgressDialog();

mZhihuFragment.showError(e.getMessage());

}

@Override

publicvoidonNext(Objectobject){

shadowView.hidProgressDialog();

}

});

addSubscription(subscription);添加观察者集合,以便于统一销毁

}

在ShadowPresenterImpl中获取相应的数据,在主线程中就可以对UI主界面进行操作,OK,结束。

 

引用如下:

compile'com.squareup.retrofit:

retrofit:

2.0.0-beta2'

compile'com.squareup.retrofit:

converter-gson:

2.0.0-beta2'

compile'com.android.support:

recyclerview-v7:

24.1.1'

compile'com.squareup.retrofit2:

adapter-rxjava:

+'

compile'com.google.code.gson:

gson:

+'

compile'io.reactivex:

rxjava:

+'

compile'com.squareup.retrofit:

adapter-rxjava:

+'

compile'com.trello:

rxlifecycle:

+'

compile'com.trello:

rxlifecycle-components:

+'

compile'com.android.support:

design:

24.1.1'

compile'com.android.support:

support-v4:

24.1.1'

compile'com.android.support:

recyclerview-v7:

24.1.1'

compile'com.google.code.gson:

gson:

2.2.4'

compile'com.jakewharton:

butterknife:

5.1.1'

compile'com.android.support:

cardview-v7:

24.1.1'

展开阅读全文
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2