MVP+Retrofit+RXAndroid使用详解

最近研究在MVP设计模式下Retrofit结合RXandroid 构建程序网络交互模块,以此记录!

有关MVP讲解以及Retrofit&Rxandroid概述此处忽略:

直接Demo:

目录结构如下:(经典的MVP结构)

demo模块模拟注册和登录:

mode层结构:

 (这里细分了 bean &biz & serviceapi 三个包)

bean就是一些实体类,主要来看下 biz 和 serviceapi

 biz:主要定义了一些业务接口以及实现类:

  // 定义业务接口
[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public interface IBusiness {  
  2.   
  3.     /** 
  4.      * 注册 
  5.      * @param mUserVo:请求参数:封装为bean 
  6.      * @param mICallBackListener:回调接口 
  7.      */  
  8.     public void register(UserVo mUserVo, ICallBackListener mICallBackListener);  
  9.   
  10.     /** 
  11.      * 登录 
  12.      * @param obj:请求参数,可根据实际需求定义 
  13.      * @param  mICallBackListener:回调接口 
  14.      */  
  15.     public void login(Object obj, ICallBackListener mICallBackListener);  
  16.   
  17.     /** 
  18.      * 忘记密码 
  19.      * @param obj:请求参数,可根据实际需求定义 
  20.      * @param  mICallBackListener:回调接口 
  21.      */  
  22.     public void forgetPwd(Object obj, ICallBackListener mICallBackListener);  
  23.   
  24.     /** 
  25.      * 意见反馈 
  26.      * @param obj:请求参数,可根据实际需求定义 
  27.      * @param  mICallBackListener:回调接口 
  28.      */  
  29.     public void feedBack(Object obj, ICallBackListener mICallBackListener);  
  30.   
  31.     //  TODO MORE  
  32. }  
 //实现业务接口(Retrofit 结合 RxAndroid)
[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class Business implements IBusiness {  
  2.   
  3.     private static final String TAG = Business.class.getSimpleName();  
  4.   
  5.     @Override  
  6.     public void register(UserVo mUserVo, final ICallBackListener mICallBackListener) {  
  7.   
  8.         IServiceAPI mIServiceAPI = HttpDao.getInstance().getIServiceAPI();  
  9.         mIServiceAPI.register(mUserVo)  
  10.                 // Subscriber前面执行的代码都是在I/O线程中运行  
  11.                 .subscribeOn(Schedulers.io())  
  12.                 // 操作observeOn之后操作主线程中运行.  
  13.                 .observeOn(AndroidSchedulers.mainThread())  
  14.                 .subscribe(HttpDao.getInstance().createSubscriber(mICallBackListener));  
  15.     }  
  16.   
  17.     @Override  
  18.     public void login(Object obj, ICallBackListener mICallBackListener) {  
  19.         IServiceAPI mIServiceAPI =  HttpDao.getInstance().getIServiceAPI();  
  20.         mIServiceAPI.login("login",(UserVo)obj)  
  21.                 .subscribeOn(Schedulers.io())  
  22.                 .observeOn(AndroidSchedulers.mainThread())  
  23.                 .subscribe(HttpDao.getInstance().createSubscriber(mICallBackListener));  
  24.     }  
  25.   
  26.     @Override  
  27.     public void forgetPwd(Object obj, ICallBackListener mICallBackListener) {  
  28.         // TODO  
  29.     }  
  30.   
  31.     @Override  
  32.     public void feedBack(Object obj, ICallBackListener mICallBackListener) {  
  33.         // TODO  
  34.     }  
  35. }  
// 定义 回调接口
[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public interface ICallBackListener {  
  2.   
  3.     public void onSuccess(CallBackVo mCallBackVo);  
  4.     public void onFaild(CallBackVo mCallBackVo);  
  5.   
  6. }  

// HttpDao 主要对Refrofit以及RXAndroid中复用功能进行提取及整合封装为公用类
 
[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class HttpDao {  
  2.   
  3.     private static final String TAG = HttpDao.class.getSimpleName();  
  4.     private static HttpDao mHttpDao = null;  
  5.     private HttpDao() { } ;  
  6.   
  7.     public static HttpDao getInstance() {  
  8.         if (mHttpDao == null) {  
  9.             mHttpDao = new HttpDao();  
  10.         }  
  11.         return mHttpDao;  
  12.     }  
  13.   
  14.     /** 
  15.      * 获取 IServiceAPI实列 
  16.      * @return IServiceAPI 
  17.      */  
  18.     public IServiceAPI getIServiceAPI() {  
  19.         // 使用自定义转换器  
  20.         Gson mGson = new GsonBuilder()  
  21.                 .registerTypeAdapter(String.class, new DeserializerData())  
  22.                 .create();  
  23.         Retrofit mRetrofit = new Retrofit.Builder()  
  24.                 .baseUrl(Consts.BASE_URL)  
  25.                 .addConverterFactory(GsonConverterFactory.create(mGson))  
  26.                  //build.gradle引入:compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'  
  27.                 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  28.                 .build();  
  29.         return mRetrofit.create(IServiceAPI.class);  
  30.     }  
  31.   
  32.     /** 
  33.      * 创建 Subscriber 
  34.      * @param mICallBackListener 
  35.      * @return Subscriber 
  36.      */  
  37.     public Subscriber createSubscriber(final ICallBackListener mICallBackListener) {  
  38.         Subscriber mSubscriber = new Subscriber<String>() {  
  39.             @Override  
  40.             public void onCompleted() {  
  41.                 Log.i(TAG, "[onCompleted]");  
  42.             }  
  43.             @Override  
  44.             public void onError(Throwable e) {  
  45.                 Log.e(TAG, "[onError]" + e.getMessage());  
  46.                 CallBackVo mCallBackVo = new CallBackVo();  
  47.                 mCallBackVo.setResCode("400");  
  48.                 mCallBackVo.setResMsg("请求失败");  
  49.                 mCallBackVo.setResObj(null);  
  50.                 mICallBackListener.onFaild(mCallBackVo);  
  51.                 return;  
  52.             }  
  53.             @Override  
  54.             public void onNext(String s) {  
  55.                 Log.i(TAG, "[onNext]" + s);  
  56.                 Gson gosn = new Gson();  
  57.                 CallBackVo mCallBackVo = gosn.fromJson(s, CallBackVo.class);  
  58.                 if (mCallBackVo.getResCode().equals(Consts.REQUEST_SUCCESS_CODE)) {  
  59.                     mICallBackListener.onSuccess(mCallBackVo);  
  60.                 } else {  
  61.                     mICallBackListener.onFaild(mCallBackVo);  
  62.                 }  
  63.             }  
  64.         };  
  65.         return mSubscriber;  
  66.     }  
  67. }  

 serviceapi:主要对reftofit框架定义了http的网络交互java接口以及自定义转换器:

// IserviceApi 定义网络交互 JAVA接口
[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public interface IServiceAPI {  
  2.   
  3.     // 注册  
  4.     @POST("regist")  
  5.     Observable<String> register(@Body UserVo mUserVo);  
  6.   
  7.     // 登录  
  8.     @POST("{mode}")  
  9.     Observable<String> login(@Path("mode") String value, @Body UserVo userVo);  
  10.   
  11. }  

 

// DeserializerData 自定义转换器/Gson对象

 

  1. public class DeserializerData implements JsonDeserializer {  
  2.     @Override  
  3.     public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {  
  4.         return json.toString();  
  5.     }  
  6. }  
Mode层至此已经结束,下面看看View层

View层结构:

为了直观这里创建activity以及iactivityview两个包,activity存放就是具体的Activity类,而iactivityview存放activity对应的接口view。
这里就拿注册作为案列:
先看注册view接口:
  1. public interface IRegisterActivityView {  
  2.   
  3.     /** 
  4.      * 获取参数 
  5.      * 
  6.      * @return 
  7.      */  
  8.     public UserVo getParamenters();  
  9.   
  10.     /** 
  11.      * 显示操作进度 
  12.      */  
  13.     public void showProgress();  
  14.   
  15.     /** 
  16.      * 关闭进度 
  17.      */  
  18.     public void closeProgress();  
  19.   
  20.     /** 
  21.      * 成功回调 
  22.      */  
  23.     public void excuteSuccessCallBack(CallBackVo mCallBackVo);  
  24.   
  25.     /** 
  26.      * 失败回调 
  27.      */  
  28.     public void excuteFailedCallBack(CallBackVo mCallBackVo);  
  29.   
  30.   
  31. }  

IRegisterActivityView 为activity提供了基本的方法来操作view。
接下来activity实现该view接口实现并且实现对应的方法即可:
RegisterActivity:
  1. public class RegisterActivity extends BaseActivity implements IRegisterActivityView {  
  2.   
  3.     @Bind(R.id.title)  
  4.     TextView title;  
  5.     @Bind(R.id.name)  
  6.     EditText name;  
  7.     @Bind(R.id.pwd)  
  8.     EditText pwd;  
  9.     @Bind(R.id.repwd)  
  10.     EditText repwd;  
  11.     @Bind(R.id.registerBt)  
  12.     Button registerBt;  
  13.     private RegisterActivityPresenter mRegisterActivityPresenter;  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_register);  
  19.         ButterKnife.bind(this);  
  20.         initView();  
  21.         mRegisterActivityPresenter = new RegisterActivityPresenter(this);  
  22.     }  
  23.   
  24.     @Override  
  25.     public void initView() {  
  26.         super.initView();  
  27.         registerBt.setOnClickListener(this);  
  28.     }  
  29.   
  30.     @Override  
  31.     public UserVo getParamenters() {  
  32.         UserVo mUserVo = new UserVo();  
  33.         mUserVo.setRegisterName(name.getText().toString());  
  34.         mUserVo.setRegisterPwd(pwd.getText().toString());  
  35.         mUserVo.setrRegisterPwd(repwd.getText().toString());  
  36.         return mUserVo;  
  37.     }  
  38.   
  39.     @Override  
  40.     public void showProgress() {  
  41.         MDialog.getInstance(this).showProgressDialog();  
  42.     }  
  43.   
  44.     @Override  
  45.     public void closeProgress() {  
  46.         MDialog.getInstance(this).closeProgressDialog();  
  47.     }  
  48.   
  49.     @Override  
  50.     public void excuteSuccessCallBack(CallBackVo mCallBackVo) {  
  51.         RegisterVo mRegisterVo = (RegisterVo) mCallBackVo.getResObj();  
  52.         String name = mRegisterVo.getName();  
  53.         MDialog.getInstance(this).showToast(mCallBackVo.getResMsg() + "[" + name + "]");  
  54.         Intent intent = new Intent(this, LoginActivity.class);  
  55.         startActivity(intent);  
  56.     }  
  57.   
  58.     @Override  
  59.     public void excuteFailedCallBack(CallBackVo mCallBackVo) {  
  60.         MDialog.getInstance(this).showToast(mCallBackVo.getResMsg());  
  61.     }  
  62.   
  63.     @Override  
  64.     public void onClick(View v) {  
  65.         switch (v.getId()) {  
  66.             case R.id.registerBt:  
  67.                 String nameStr = name.getText().toString();  
  68.                 String pwdStr = pwd.getText().toString();  
  69.                 String rePwdStr = repwd.getText().toString();  
  70.                 if (CommUtils.strISNull(nameStr) || CommUtils.strISNull(pwdStr) || CommUtils.strISNull(rePwdStr)) {  
  71.                     MDialog.getInstance(this).showToast("请填写完整信息");  
  72.                     return;  
  73.                 } else if (!pwdStr.equals(rePwdStr)) {  
  74.                     MDialog.getInstance(this).showToast("密码不一致");  
  75.                     return;  
  76.                 }  
  77.                 mRegisterActivityPresenter.userRegister();  
  78.                 break;  
  79.             default:  
  80.                 break;  
  81.         }  
  82.     }  
  83. }  

至此View层结束下面看看Presenter层:

presenter 层结构:

presenter层主要是View层与Mode层通信的桥梁,MVP模式View与Mode不直接进行数据交互因此通过Presenter来操作。
presenter层 定义了 V 对应的 P(同样看看注册)
  1. public class RegisterActivityPresenter implements IBasePresenter {  
  2.   
  3.     private IRegisterActivityView mIRegisterActivityView;  
  4.   
  5.     public RegisterActivityPresenter(IRegisterActivityView mIRegisterActivityView) {  
  6.         this.mIRegisterActivityView = mIRegisterActivityView;  
  7.     }  
  8.   
  9.     public void userRegister() {  
  10.         mIRegisterActivityView.showProgress();  
  11.         mIBusiness.register(mIRegisterActivityView.getParamenters(), new ICallBackListener() {  
  12.             @Override  
  13.             public void onSuccess(final CallBackVo mCallBackVo) {  
  14.                 mHandler.post(new Runnable() {  
  15.                     @Override  
  16.                     public void run() {  
  17.                         Gson mGson = new Gson();  
  18.                         JsonElement mJsonElement = mGson.toJsonTree(mCallBackVo.getResObj());  
  19.                         Type mType = new TypeToken<RegisterVo>() {  
  20.                         }.getType();  
  21.                         RegisterVo mRegisterVo = mGson.fromJson(mJsonElement, mType);  
  22.                         mCallBackVo.setResObj(mRegisterVo);  
  23.                         mIRegisterActivityView.closeProgress();  
  24.                         mIRegisterActivityView.excuteSuccessCallBack(mCallBackVo);  
  25.                     }  
  26.                 });  
  27.             }  
  28.   
  29.             @Override  
  30.             public void onFaild(final CallBackVo mCallBackVo) {  
  31.                 mHandler.post(new Runnable() {  
  32.                     @Override  
  33.                     public void run() {  
  34.                         mIRegisterActivityView.closeProgress();  
  35.                         mIRegisterActivityView.excuteFailedCallBack(mCallBackVo);  
  36.                     }  
  37.                 });  
  38.             }  
  39.         });  
  40.     }  
  41. }  
此 RegisterActivityPresenter 提供了一个注册功能,使用时在对应Activity中实例化该对象后即可调用所需方法:

至此 M V P 层结构已经构建结束。
文中涉及[Retrofit]和 [Rxandroid]以及[ButterKnifeZelezny] 的build.gradle配置如下:
  1. // Retrofit(需要gson + adapter-rxjava)  
  2. compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'  
  3. compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'  
  4. // rxAndroid  
  5. compile 'io.reactivex:rxandroid:1.2.0'  
  6. compile 'io.reactivex:rxjava:1.1.5'  
  7. //ButterKnifeZelezny  
  8. compile 'com.jakewharton:butterknife:7.0.1'  
 
GitHub地址:
RxAndroid
 
posted @ 2017-05-02 12:06  天涯海角路  阅读(251)  评论(0)    收藏  举报