RxJavaRetrofitMVP.docx
- 文档编号:23812918
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:11
- 大小:18.42KB
RxJavaRetrofitMVP.docx
《RxJavaRetrofitMVP.docx》由会员分享,可在线阅读,更多相关《RxJavaRetrofitMVP.docx(11页珍藏版)》请在冰豆网上搜索。
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")
Observable
@GET("/api/4/news/{id}")
Observable
}
Retrofit有很多注解,GETPOSTDELETE等等主要是说请求方式
1.@GET("/api/4/news/latest")===http:
//news-/api/4/news/latest
Observable
2.@GET("/api/4/news/before/{date}")http:
//news-/api/4/news/before?
date=date
Observable
3.@GET("/api/4/news/{id}")http:
//news-/api/4/news?
id=id
Observable
4.@GET("/weather")多个参数请求
Observable
5.@GET("applist/apps/detail")参数不固定的时候
Call
6.@GET("applist/apps/detail?
type=detail")静态参数,动态参数混合使用
Call
7.@Headers("Accept-Encoding:
application/json") 固定添加header,但是一般都是写个拦截器,在httpclient中进行设置
@GET("applist/apps/detail?
type=detail")
Call
8.@Headers({多个header的时候
"X-Foo:
Bar",
"X-Ping:
Pong"
})
POST请求不能把数据放在URL中,需要放在请求体中,所以我们可以这样做:
1.@POST("/login/")
Observable
User是个对象,所以我们在传递参数的时候需要传递一个对象过来。
。
2.通过@Field来指定key,后面跟上value
@FormUrlEncoded
@POST("/newfind/index_ask")
Observable
@Field("pageSize")intsize,
@Field("tokenMark")longtokenMark,
@Field("token")Stringtoken
);
3.请求体过多,采用map传递参数,直接传过来封装好的map即可
@FormUrlEncoded
@POST("FundPaperTrade/AppUserLogin")
Observable
以上三种请求都是以键值对形式去请求,但是一般项目中post请求除了键值对,也还会遇到json、xml的请求,后台也做了约束,约束其上传格式为json/xml,无默认(防止不认识上传的东东),所以一般要添加头文件(测试必须得用fiddle,可减少一大半时间,悔~)
下面谈谈如何添加头文件,第一种方式直接在api中请求方式之上添加,如下:
1.@Headers({"Content-type:
application/json",
"Content-Length:
59"})*/
@POST("FundPaperTrade/AppUserLogin")
Observable
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")
Observable
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'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RxJavaRetrofitMVP