前言
在android
开发过程中,我用得比较多的是mvp
架构,然而在代码不断优化的过程中,出现了系列问题,主要冲突在于:我需要在具备mvp架构
的同时,能兼容下一个Activity
的基类,毕竟一个BaseActivity
在一个项目中具备重要作用。那么今天就来讲讲mvp架构
和BaseActivity
之间的冲突问题吧
今天涉及以下内容:
- mvp架构简单介绍
- mvp架构下添加BaseActivity猜想
2.1 希望的需求
2.2 继承扩展猜想
2.3 代理模式增强猜想
2.4 抽象接口猜想 - 最后的话
一.mvp架构简单介绍
mvp架构
基于顶层接口设计,则会具备以下两个接口类:
/**
* MVP-View基类
*/
public interface PreView {
}
以及
/**
* Created by Admin on 2017/5/16.
*
* T-MVP Presenter基类
*/
public interface PrePresenter {
void attachView();
void detachView();
}
然后基于以上两个接口类写一个Contract
,以MainContract
为例,代码如下:
public class MainContract {
public interface View extends PreView {
void loginSuccess(SaleOrganizationInfo soInfo);
void loginFail(String msg);
}
public interface Presenter extends PrePresenter {
//登录
void postLogin(String userName, String passWord, String type);
}
}
接着对以前写过的一个Activity
基类要做一个简单的处理,如下:
public abstract class AppActivity2<T extends PrePresenter> extends SuperActivity {
protected T mPresenter;
@Override
public void loadMVP() {
super.loadMVP();
mPresenter = getPresenter();
if (mPresenter != null) {
mPresenter.attachView();
}
}
@Override
protected void onDestroy() {
if (mPresenter != null) {
mPresenter.detachView();
}
super.onDestroy();
}
public abstract T getPresenter();
}
然后实现Presenter
接口,写一个MainPresenter
:
public class MainPresenter implements MainContract.Presenter{
private Context mContext;
private MainContract.View mView;
public MainPresenter(Context context, PreView view) {
this.mContext = context;
this.mView = (MainContract.View) view;
}
@Override
public void attachView() {//可以用来注册RxBus
}
@Override
public void detachView() {//可以用来注销RxBus
}
@Override
public void postLogin(String userName, String passWord) {
TreeMap<String, String> map = new TreeMap<String, String>();
map.put("username", userName);// 用户名
map.put("password", passWord);// 密码
ApiService apiService = (ApiService) ApiRetrofitor.getInstance().getBaseRetrofitor().getApiService();
//发起请求
Observable observable = apiService.postLogin(map);
LoadingDialog.getInstance().showLoading(mContext);
RxManager.connect(observable, new ApiObserver<ResponseData<SaleOrganizationInfo>>() {
@Override
public void doNext(ResponseData<SaleOrganizationInfo> responseData) {
LoadingDialog.getInstance().hideLoading();
int code = responseData.getCode();
String message = responseData.getMessage();
switch (code) {
case ResponseCode.SUCCES_CODE://成功
SaleOrganizationInfo soInfo = responseData.getData();
mView.loginSuccess(soInfo);
break;
default://失败
mView.loginFail(message);
break;
}
}
@Override
public void doError(ServerException e) {
LoadingDialog.getInstance().hideLoading();
mView.loginFail(e.getMessage());
}
});
}
}
最后在Activity
中作如下使用:
public class SocketActivity2 extends AppActivity2<MainPresenter>implements MainContract.View {
@Override
public int getContentViewId() {
return R.layout.activity_main;
}
@Override
public MainPresenter getPresenter() {
return null;
}
@Override
public void initData() {
}
@Override
public void setListener() {
}
@Override
public void loginSuccess(SaleOrganizationInfo soInfo) {
}
@Override
public void loginFail(String msg) {
}
}
二.mvp架构下添加BaseActivity猜想
2.1 希望的需求
在以上讲的mvp
模式下,我们希望做到的是在不改变以上代码的前提下,对Activity基类
增强。
2.2 继承扩展猜想
最直接的想法无非是继承AppActivity2
再写一个基类,然后在基类中作扩展,类似如下: