MVP+Retrofit+RXAndroid使用详解
2016-05-16 14:37
627 查看
最近研究在MVP设计模式下Retrofit结合RXandroid 构建程序网络交互模块,以此记录!
有关MVP讲解以及Retrofit&Rxandroid概述此处忽略:
直接Demo:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/b43ddf6143b71d8b164112e19329b034)
serviceapi 三个包)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/644b07145594217a110c47ef6a5461d5)
bean就是一些实体类,主要来看下 biz 和 serviceapi
//实现业务接口(Retrofit 结合 RxAndroid)
// 定义 回调接口
// HttpDao 主要对Refrofit以及RXAndroid中复用功能进行提取及整合封装为公用类
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/c21985243f4ea24968f4bdf9bff43a2e)
// IserviceApi 定义网络交互 JAVA接口
// DeserializerData 自定义转换器/Gson对象
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/88aa7e2e3c9b3c1622a957da6c4cd3ea)
IRegisterActivityView 为activity提供了基本的方法来操作view。
至此View层结束下面看看Presenter层:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/43f87d6aea96a01300fc73af6ed8c200)
presenter层主要是View层与Mode层通信的桥梁,MVP模式View与Mode不直接进行数据交互因此通过Presenter来操作。presenter层 定义了 V 对应的 P(同样看看注册)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/779efcb38b286bdf07fefb9ac93b7300)
至此 M V P 层结构已经构建结束。文中涉及[Retrofit]和 [Rxandroid]以及[ButterKnifeZelezny] 的build.gradle配置如下:
GitHub地址:RxAndroidRetrofit
android-butterknife-zelezny
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/09/11900b98fc3cdecc118997aad8e07de6)
有关MVP讲解以及Retrofit&Rxandroid概述此处忽略:
直接Demo:
目录结构如下:(经典的MVP结构)
demo模块模拟注册和登录:
mode层结构:
(这里细分了 bean &biz &serviceapi 三个包)
bean就是一些实体类,主要来看下 biz 和 serviceapi
biz:主要定义了一些业务接口以及实现类:
// 定义业务接口public interface IBusiness { /** * 注册 * @param mUserVo:请求参数:封装为bean * @param mICallBackListener:回调接口 */ public void register(UserVo mUserVo, ICallBackListener mICallBackListener); /** * 登录 * @param obj:请求参数,可根据实际需求定义 * @param mICallBackListener:回调接口 */ public void login(Object obj, ICallBackListener mICallBackListener); /** * 忘记密码 * @param obj:请求参数,可根据实际需求定义 * @param mICallBackListener:回调接口 */ public void forgetPwd(Object obj, ICallBackListener mICallBackListener); /** * 意见反馈 * @param obj:请求参数,可根据实际需求定义 * @param mICallBackListener:回调接口 */ public void feedBack(Object obj, ICallBackListener mICallBackListener); // TODO MORE }
//实现业务接口(Retrofit 结合 RxAndroid)
public class Business implements IBusiness { private static final String TAG = Business.class.getSimpleName(); @Override public void register(UserVo mUserVo, final ICallBackListener mICallBackListener) { IServiceAPI mIServiceAPI = HttpDao.getInstance().getIServiceAPI(); mIServiceAPI.register(mUserVo) // Subscriber前面执行的代码都是在I/O线程中运行 .subscribeOn(Schedulers.io()) // 操作observeOn之后操作主线程中运行. .observeOn(AndroidSchedulers.mainThread()) .subscribe(HttpDao.getInstance().createSubscriber(mICallBackListener)); } @Override public void login(Object obj, ICallBackListener mICallBackListener) { IServiceAPI mIServiceAPI = HttpDao.getInstance().getIServiceAPI(); mIServiceAPI.login("login",(UserVo)obj) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(HttpDao.getInstance().createSubscriber(mICallBackListener)); } @Override public void forgetPwd(Object obj, ICallBackListener mICallBackListener) { // TODO } @Override public void feedBack(Object obj, ICallBackListener mICallBackListener) { // TODO } }
// 定义 回调接口
public interface ICallBackListener { public void onSuccess(CallBackVo mCallBackVo); public void onFaild(CallBackVo mCallBackVo); }
// HttpDao 主要对Refrofit以及RXAndroid中复用功能进行提取及整合封装为公用类
public class HttpDao { private static final String TAG = HttpDao.class.getSimpleName(); private static HttpDao mHttpDao = null; private HttpDao() { } ; public static HttpDao getInstance() { if (mHttpDao == null) { mHttpDao = new HttpDao(); } return mHttpDao; } /** * 获取 IServiceAPI实列 * @return IServiceAPI */ public IServiceAPI getIServiceAPI() { // 使用自定义转换器 Gson mGson = new GsonBuilder() .registerTypeAdapter(String.class, new DeserializerData()) .create(); Retrofit mRetrofit = new Retrofit.Builder() .baseUrl(Consts.BASE_URL) .addConverterFactory(GsonConverterFactory.create(mGson)) //build.gradle引入:compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return mRetrofit.create(IServiceAPI.class); } /** * 创建 Subscriber * @param mICallBackListener * @return Subscriber */ public Subscriber createSubscriber(final ICallBackListener mICallBackListener) { Subscriber mSubscriber = new Subscriber<String>() { @Override public void onCompleted() { Log.i(TAG, "[onCompleted]"); } @Override public void onError(Throwable e) { Log.e(TAG, "[onError]" + e.getMessage()); CallBackVo mCallBackVo = new CallBackVo(); mCallBackVo.setResCode("400"); mCallBackVo.setResMsg("请求失败"); mCallBackVo.setResObj(null); mICallBackListener.onFaild(mCallBackVo); return; } @Override public void onNext(String s) { Log.i(TAG, "[onNext]" + s); Gson gosn = new Gson(); CallBackVo mCallBackVo = gosn.fromJson(s, CallBackVo.class); if (mCallBackVo.getResCode().equals(Consts.REQUEST_SUCCESS_CODE)) { mICallBackListener.onSuccess(mCallBackVo); } else { mICallBackListener.onFaild(mCallBackVo); } } }; return mSubscriber; } }
serviceapi:主要对reftofit框架定义了http的网络交互java接口以及自定义转换器:
// IserviceApi 定义网络交互 JAVA接口
public interface IServiceAPI { // 注册 @POST("regist") Observable<String> register(@Body UserVo mUserVo); // 登录 @POST("{mode}") Observable<String> login(@Path("mode") String value, @Body UserVo userVo); }
// DeserializerData 自定义转换器/Gson对象
public class DeserializerData implements JsonDeserializer { @Override public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return json.toString(); } }Mode层至此已经结束,下面看看View层
View层结构:
为了直观这里创建activity以及iactivityview两个包,activity存放就是具体的Activity类,而iactivityview存放activity对应的接口view。这里就拿注册作为案列:
先看注册view接口:
public interface IRegisterActivityView { /** * 获取参数 * * @return */ public UserVo getParamenters(); /** * 显示操作进度 */ public void showProgress(); /** * 关闭进度 */ public void closeProgress(); /** * 成功回调 */ public void excuteSuccessCallBack(CallBackVo mCallBackVo); /** * 失败回调 */ public void excuteFailedCallBack(CallBackVo mCallBackVo); }
IRegisterActivityView 为activity提供了基本的方法来操作view。
接下来activity实现该view接口实现并且实现对应的方法即可:
RegisterActivity:
public class RegisterActivity extends BaseActivity implements IRegisterActivityView { @Bind(R.id.title) TextView title; @Bind(R.id.name) EditText name; @Bind(R.id.pwd) EditText pwd; @Bind(R.id.repwd) EditText repwd; @Bind(R.id.registerBt) Button registerBt; private RegisterActivityPresenter mRegisterActivityPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); ButterKnife.bind(this); initView(); mRegisterActivityPresenter = new RegisterActivityPresenter(this); } @Override public void initView() { super.initView(); registerBt.setOnClickListener(this); } @Override public UserVo getParamenters() { UserVo mUserVo = new UserVo(); mUserVo.setRegisterName(name.getText().toString()); mUserVo.setRegisterPwd(pwd.getText().toString()); mUserVo.setrRegisterPwd(repwd.getText().toString()); return mUserVo; } @Override public void showProgress() { MDialog.getInstance(this).showProgressDialog(); } @Override public void closeProgress() { MDialog.getInstance(this).closeProgressDialog(); } @Override public void excuteSuccessCallBack(CallBackVo mCallBackVo) { RegisterVo mRegisterVo = (RegisterVo) mCallBackVo.getResObj(); String name = mRegisterVo.getName(); MDialog.getInstance(this).showToast(mCallBackVo.getResMsg() + "[" + name + "]"); Intent intent = new Intent(this, LoginActivity.class); startActivity(intent); } @Override public void excuteFailedCallBack(CallBackVo mCallBackVo) { MDialog.getInstance(this).showToast(mCallBackVo.getResMsg()); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.registerBt: String nameStr = name.getText().toString(); String pwdStr = pwd.getText().toString(); String rePwdStr = repwd.getText().toString(); if (CommUtils.strISNull(nameStr) || CommUtils.strISNull(pwdStr) || CommUtils.strISNull(rePwdStr)) { MDialog.getInstance(this).showToast("请填写完整信息"); return; } else if (!pwdStr.equals(rePwdStr)) { MDialog.getInstance(this).showToast("密码不一致"); return; } mRegisterActivityPresenter.userRegister(); break; default: break; } } }
至此View层结束下面看看Presenter层:
presenter 层结构:
presenter层主要是View层与Mode层通信的桥梁,MVP模式View与Mode不直接进行数据交互因此通过Presenter来操作。presenter层 定义了 V 对应的 P(同样看看注册)
public class RegisterActivityPresenter implements IBasePresenter { private IRegisterActivityView mIRegisterActivityView; public RegisterActivityPresenter(IRegisterActivityView mIRegisterActivityView) { this.mIRegisterActivityView = mIRegisterActivityView; } public void userRegister() { mIRegisterActivityView.showProgress(); mIBusiness.register(mIRegisterActivityView.getParamenters(), new ICallBackListener() { @Override public void onSuccess(final CallBackVo mCallBackVo) { mHandler.post(new Runnable() { @Override public void run() { Gson mGson = new Gson(); JsonElement mJsonElement = mGson.toJsonTree(mCallBackVo.getResObj()); Type mType = new TypeToken<RegisterVo>() { }.getType(); RegisterVo mRegisterVo = mGson.fromJson(mJsonElement, mType); mCallBackVo.setResObj(mRegisterVo); mIRegisterActivityView.closeProgress(); mIRegisterActivityView.excuteSuccessCallBack(mCallBackVo); } }); } @Override public void onFaild(final CallBackVo mCallBackVo) { mHandler.post(new Runnable() { @Override public void run() { mIRegisterActivityView.closeProgress(); mIRegisterActivityView.excuteFailedCallBack(mCallBackVo); } }); } }); } }此 RegisterActivityPresenter 提供了一个注册功能,使用时在对应Activity中实例化该对象后即可调用所需方法:
至此 M V P 层结构已经构建结束。文中涉及[Retrofit]和 [Rxandroid]以及[ButterKnifeZelezny] 的build.gradle配置如下:
// Retrofit(需要gson + adapter-rxjava) compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' // rxAndroid compile 'io.reactivex:rxandroid:1.2.0' compile 'io.reactivex:rxjava:1.1.5' //ButterKnifeZelezny compile 'com.jakewharton:butterknife:7.0.1'
GitHub地址:RxAndroidRetrofit
android-butterknife-zelezny
相关文章推荐
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(一)
- 浅析MVP模式中V-P交互问题及案例分享
- 完整的Android MVP开发之旅
- 详解Android MVP开发模式
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(二)
- Android Retrofit 2.0框架上传图片解决方案
- 跟我一起看Retrofit 2.0的源码
- RxJava之subscribeOn解惑
- 两岸MVP强强联手--最硬Windows Server 2008达人
- 对MVC、MVP、MVVM的理解
- 微软社区精英计划问与答
- 什么是微软MVP?
- MVC和MVP在app中的对比分析以及实际应用
- android MVP设计模式
- Rxjava
- http缓存
- 认识Android MVP
- android REST APIs 工具 Retrofit的应用
- JavaWeb程序架构模式的演进