MVP+Retrofit+RXAndroid使用详解

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

有关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地址:
RxAndroid






  
  









  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值