经过上一篇文章的介绍我们已经对mvp有了比较清晰的认识,上一篇博客链接如下 带你一步一步认识MVP -step1 接下来我们就来解决之前mvp遗留的问题。
1. 很多代码是公用反复的,attach detach 每个 Presenter 都要有
2. Activity -> View 的 attach detach 每个 View 层也要有
3.可能有内存泄漏风向(我们的attach传入的view是this)
为了解决这些问题我们需要一些base类的支撑
首先使我们的baseview(没有任何处理的空接口)
public interface BaseView {
}
之后需要一个presenter的base类来支撑一些共通化处理
public class BasePresenter<V extends BaseView> {
private V mView;
public void attach(V view) {
this.mView = view;
}
//对象虽然设置为了空 但是根据java内存回收机制该处理还是有内存泄漏风险 model的处理没有
public void detach() {
this.mView = null;
}
public V getView() {
return mView;
}
}
这里我们在base类里面添加了attach和detach的处理,以及提供了getView的处理我们将不再需要定义成员变量view只需调用getView方法获取我们的view
接下来我们需要一个base的activity来统一接管prestnere代码如下
public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView {
private P mPresenter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView();
// 创建 P,创建只能交给 子类,每个 Activity 都不一样
mPresenter = createPresenter();
mPresenter.attach(this);
initView();
initData();
}
// 由子类去实现创建
protected abstract P createPresenter();
protected abstract void initData();
protected abstract void initView();
//或者实现給view的id调用setContentView方法
protected abstract void setContentView();
@Override
public void onDestroy() {
super.onDestroy();
mPresenter.detach();
}
public P getPresenter() {
return mPresenter;
}
}
这个过程的处理解决了我们之前的问题 在baseActivity我们通过子类的创建生成了mPresenter 在onDestroy中我们调用mPresenter.detach的方法进行解绑,同时提供了getPresenter方法获取我们的presenter对象。下面再看我们的具体实现
首先还是model的处理(跟以前一样没什么特殊处理)
public class UserInfoModel {
public List<UserInfo> getUserInfo() {
List<UserInfo> userInfos = new ArrayList<>();
userInfos.add(new UserInfo("a", "1"));
userInfos.add(new UserInfo("b", "2"));
userInfos.add(new UserInfo("c", "3"));
return userInfos;
}
}
然后是view(除了继承baseView没什么大的变化)
public interface UserInfoView extends BaseView {
void onLoading(); // 1.正在加载中
void onError(); // 2.获取出错了
void onSucceed(List<UserInfo> userInfo); // 3.成功了要显示数据
}
之后是 Presenter大家可以看看这个类的变化
public class UserInfoPresenter extends BasePresenter<UserInfoView>{
private UserInfoModel model;
public UserInfoPresenter() {
model = new UserInfoModel();
}
public void getDate() {
try {
List<UserInfo> userInfos = model.getUserInfo();
if (getView() == null) return;
getView().onSucceed(userInfos);
} catch (Exception e) {
getView().onError();
}
}
}
prestner不再处理attach和detach对view的绑定处理了(这里交给了base去处理),prestnter的代码瞬间简洁了许多
最后使我们的activity的处理
public class MainActivity extends BaseMvpActivity<UserInfoPresenter> implements UserInfoView {
@Override
protected UserInfoPresenter createPresenter() {
return new UserInfoPresenter();
}
@Override
protected void initData() {
getPresenter().getDate();
}
@Override
protected void initView() {
setContentView(R.layout.activity_main);
}
@Override
protected void setContentView() {
}
@Override
public void onLoading() {
}
@Override
public void onError() {
//todo 错误提示
}
@Override
public void onSucceed(List<UserInfo> userInfo) {
//todo 显示数据列表
int count = userInfo.size();
}
}
与之前相比多了一个createPresenter方法返回我们的presenter在我们调用presenter的时候直接调用getPresenter即可不再需要设置成员变量了
以上问题我们貌似就差一点没解决就是内存泄漏的处理,同时我们的model的处理也是有些单薄,带着这些问题我们来查看下一篇博客。
带你一步一步认识MVP -step3