这里参考了simple哥做了一个通用版的mvp,并对google的MVP做了一点自己的解析。
原文地址:
http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820273&idx=1&sn=bb390bd5b1b678435ee4ae5014c651d2&scene=0#wechat_redirect
1
Presenter持有Activity对象可能导致的内存泄漏问题
只要用过mvp这个问题可能很多人都知道。写mvp的时候,presenter会持有view,如果presenter有后台异步的长时间的动作,比如网络请求,这时如果返回退出了Activity,后台异步的动作不会立即停止,这里就会有内存泄漏的隐患,所以会在presenter中加入一个销毁view的方法。
现在就在之前的项目中做一下修改:
presenter中增加了类似的生命周期的方法,用来在退出Activity的时候取消持有Activity。
但是在销毁后需要思考一点,后台的延时操作返回时,这个时候view被销毁了,如果接着去调用view的方法就 会抛出空指针异常。所以在后台的延时操作中需要考虑到这种可能产生空指针的情况,尤其是网络请求。
2
BasePresenter
如果每一个Activity都需要做绑定和解绑操作就太麻烦了,现在我希望可以有一个通用的presenter来为我们添加view的绑定与销毁。
因为不能限定死传入的View,所以使用泛型来代替传入的对象。通过这个通用的presenter我就可以把原来的MvpPresenter简化成下面的样子
3
BaseView
界面需要提供的UI方法中会有很多类似的UI方法,可以把它们提取到一个公共的父类接口中。比如提取显示loading界面和隐藏loading界面的方法,其他的view层接口就可以直接继承BaseView接口,不必重复的写显示和隐藏loading界面方法。
4
BaseMvpActivity
presenter绑定到activity和View的绑定和解绑操作是每个Activity都会去做的,同样这里我也希望能有一个父类来完成这个统一的操作。
同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个
同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个 initPresenter();方法用来初始化presenter,如果想创建不同参数的构造函数都可以随意去创建。
5
更加通用的例子
通过上面的base父类,对之前的例子进行优化,写一个更加好用的例子。
NewMvpView 继承BaseView接口,添加自己的初始化ListView和Toast信息方法
NewMvpPresenter 继承BasePresenter类,增加网络请求和处理点击事件的方法
代码上面已经出现过。
NewMvpActivity
最终的成果,我们只需要在Acitivity中传入泛型对象,在initPresenter() 方法中初始化Presenter对象,然后就可以直接使用presenter对象了,当然View的接口还是要自己去实现。
恩,以上的方法就完成了MVP一些简单的封装。
6
扩展阅读
作者的原文中还包含对官方MVP架构的解析,由于篇幅原因,大家可以点击阅读原文继续阅读。此外关于官方MVP架构的解析也可以通过下面的文章进行学习。
http://www.jianshu.com/p/389c9ae1a82c
https://github.com/googlesamples/android-architecture |
|