A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© lizhenzhen 中级黑马   /  2016-5-30 23:00  /  314 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这里参考了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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马