MVP4Peelson
一个自用解决内存泄漏问题的MVP模式框架
索引
-Why
-How
-参考书目
Why
MVP
模式广泛运用于Android项目开发实战之中,具有易于维护、易于测试、松耦合、复用性高等特点,但是当Presenter
进行一些耗时操作时,由于其持有了View
的强引用,如果在耗时操作之前此View
层被销毁会导致Presenter
一直持有View
对象而View
对象无法收回,此时就发生了内存泄漏。
而通常的解决办法是通过自己实现一个ActivityCollector
来解决:
|
|
在BaseActivity中可以手动:
当然这个方法很蠢。
How
现在有一个全新的思路来解决这一问题。就是通过弱引用和Activity
、Fragment
的声明周期来解决这个问题。
首先建立一个Presenter
抽象,命名为BasePresenter
,它是一个泛型类,泛型类型为View
角色需要实现的接口类型:
BasePresenter
有4个方法,分别与View
建立关联、解除关联、判断是否与View
建立关联、获取View
。View
类型通过BasePresenter
的泛型类型传递进来,Presenter
对这个View
持有弱引用。通常情况下这个View
类型应该是实现了某个特定接口的Activity
或者Fragment
等类型。
然后就是利用BaseActivity基类来控制它与Presenter的关系。
BaseActivity
含有两个泛型参数,第一个是View
接口类型,第二个是Presenter
的具体类型。通过泛型参数,会使得一些通用的逻辑可以被抽象到BaseActivity
类中。例如,在BaseActivity
的onCreate
函数中,会通过createPresenter
函数创建一个具体的Presenter
,这个Presenter
的类型就是BasePresenter<V>
类型。构建Presenter
之后会调用attachView
函数与Activity
建立关联。而在onDestroy
函数中会与Activity
解除关联,从而避免内存泄漏。那么,如果在onDestroy
中解除了对Activity
的引用那么就没有必要再用弱引用了,其实,并不是在任何情况下Activity
的onDestroy
方法都会被调用,一旦这种情况发生,弱引用也会保证不会造成内存泄漏。而通过BaseActivity
的封装维护Presenter
与View
关联关系的代码,使得子类可以避免重复的代码。
例如PhotoInListFragment的代码实现如下:
此时,Presenter
的创建以及与View
建立关联等操作都被封装到BaseFragment
中,清除了子类重复代码同时又避免了Fragment
(View
)内存泄漏问题。
基于此实例请参Demo
。
如有问题请在Issues
中提出,或者与我联系。
参考
《Android源码设计模式 实战与解析(第2版)》