发表于: 2018-12-10 22:59:06

0 903


一、今天完成的事情

前一阵子初步了解了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);
   //引用ILoginView

   loginPresenter.attachView(this);

}

@Override
protected void onDestroy() {
super.onDestroy();
   //断开ILoginView引用
 loginPresenter.detachView();
}


创建BaseView、BasePresenter、BaseActivity,将一些通用方法写进去

利用泛型,将一些接口中的数据以及Presenter中的View接口定义为泛型,由调用者去定义具体的数据类型,这样可以避免因为需要不同的数据类型而重复创建接口和presenter。


二、明天的计划

使用逗你学的接口完成登录注册退出登录等功能


三、遇到的问题    

四、收获

对MVP架构的理解和使用比之前更进一步,算是勉强能用用了,今后还是要多学多用,想要掌握好不是那么容易的。





返回列表 返回列表
评论

    分享到