-
MVP模式为什么会存在内存泄漏的隐患?
当用户按返回键时,页面Activity退出,如果Model在子线程上执行耗时任务,还没有结束,Model持有Presenter的引用,Presenter持有Activity的引用。那么这个Activity对象就没有办法被回收。
-
怎么解决这个内存泄漏?
在Activity的onDestroy方法中,通过Presenter间接将Model中的耗时任务取消,然后将Presenter和Model置空。
-
既然这样可以解决内存泄漏,为什么还要用弱引用(也有代码中用软引用)?
因为onDestroy方法不一定立即执行,有可能主线程有大量的任务要处理,来不及执行onDestroy()方法。在此期间,如果GC触发,Activity对象还是无法被回收。而通过弱引用,将Activity对象转换为弱可达对象,GC一旦运行,不管内存是否充足,都会回收弱可达对象。从而解决内存泄漏。
关于onDestroy()没有立刻执行,详细的原因参考:深入分析Android中Activity的onStop和onDestroy()回调延时及延时10s的问题。关于弱可达
,网上许多解释都是不准确的,建议参考:(一)Java 中的引用类型、对象的可达性以及回收处理。