1. 程式人生 > >淺談android的MVP設計模式之記憶體洩露問題

淺談android的MVP設計模式之記憶體洩露問題

我上次寫了淺談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動不動上千行的程式碼量,簡直優雅!