发表于: 2018-12-10 22:59:06
0 904
一、今天完成的事情
前一阵子初步了解了MVP架构,今天继续学习。
因为之前只是看了一个简单的Demo,里面只有一个Activity,而我自己动手实践时发现,实际开发中有许多的
Activity,如果每个Activity都对应一套MVP的话,代码量会变得非常大,所以这几天做任务时一直想用MVP架构但是觉得无从下手,今天又花了点时间继续学习,算是稍微有了点头绪。
之前看的Demo中演示的MVP架构有很多问题
构架存在漏洞
代码冗余量大
通用性差
调用View可能引发的空指针异常
举例,应用请求网络数据时需要等待后台反馈数据后更新界面,但是在请求过程中当前Activity突然因为某种原因被销毁,Presenter收到后台反馈并调用View接口处理UI逻辑时由于Activity已经被销毁,就会引发空指针异常。
想要避免这种情况的发生就需要每次调用View前都知道宿主Activity的生命状态。
之前是在Presenter的构造方法中得到View接口的引用,现在我们需要修改Presenter引用View接口的方式让View接口与宿主Activity共存亡。
在Presenter中增加三个方法
public class BasePresenter<V extends IBaseView> {
//绑定的view接口
private V iView;
/**
* 绑定iView
* 为了防止Activity被意外销毁引发空指针,这里不直接将iView作为构造参数
* 绑定和解绑方法写在Activity的生命周期中
*/
public void attachView(V iView) {
this.iView = iView;
}
/**
* 解绑iView
*/
public void detachView() {
this.iView = null;
}
/**
* 是否与iView建立连接
* 每次调用业务请求时都要先调用此方法检查是否于iView建立连接
* @return
*/
public boolean isViewAttached() {
return iView != null;
}
/**
* 获取连接的iView
* @return
*/
public V getIView() {
return iView;
}
}
在Activity的生命周期中写入绑定view的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//引用ILoginViewloginPresenter.attachView(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//断开ILoginView引用
loginPresenter.detachView();
}
创建BaseView、BasePresenter、BaseActivity,将一些通用方法写进去
利用泛型,将一些接口中的数据以及Presenter中的View接口定义为泛型,由调用者去定义具体的数据类型,这样可以避免因为需要不同的数据类型而重复创建接口和presenter。
二、明天的计划
使用逗你学的接口完成登录注册退出登录等功能
三、遇到的问题
四、收获
对MVP架构的理解和使用比之前更进一步,算是勉强能用用了,今后还是要多学多用,想要掌握好不是那么容易的。
评论