浅谈android的MVP设计模式之内存泄露问题

来源:互联网 发布:领淘宝优惠券的软件 编辑:程序博客网 时间:2024/05/16 23:45

我上次写了浅谈mvp,经过一段时间的思考,发现我忽略了一个问题

内存泄露问题。

因为Presenter中持有View接口对象,这个接口对象实际为MainActivity.this,Modle中也同时拥有Presenter对象实例,当MainActivity要销毁时,Presenter中有Modle在获取数据,那activity肯定是无法被销毁的,所以就会造成内存泄露。
当Modle在获取数据时,不做处理,它就一直持有Presenter对象,而Presenter对象又持有Activity对象,这条GC链不剪断,Activity就无法被完整回收。

解决MVP的内存泄露

Presenter在Activity的onDestroy方法回调时执行资源释放操作
解决MVP的内存泄露
Activity

@Override    public void onDestroy() {        super.onDestroy();        mPresenter.destroy();        mPresenter = null;    }

Presenter

public void destroy() {    view = null;    if(modle != null) {        modle.cancleTasks();        modle = null;    }}

Modle

public void cancleTasks() {    // TODO 终止线程池ThreadPool.shutDown(),AsyncTask.cancle(),或者调用框架的取消任务api}

我认为吧上面这些写起来要花上不少时间,不适合小项目,但是由于面向MVP接口编程,可适应需求变更,所以MVP适用于比较大的项目;因为其简化了Activity和Fragmnt的职责,可大大减少View层的代码量,比起MVC中Activity,Fragment动不动上千行的代码量,简直优雅!

0 0