淺談android的MVP設計模式之記憶體洩露問題
阿新 • • 發佈:2019-01-04
我上次寫了淺談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動不動上千行的程式碼量,簡直優雅!