天天看點

MVP造成的記憶體洩漏

MVP有很多的優點,例如易于維護,易于測試,松耦合,複用性高,健壯穩定,易于擴充等。但是,由于Presenter經常性的需要執行一些耗時操作,那麼當我們在操作未完成時候關閉了Activity,會導緻Presenter一直持有Activity的對象,造成記憶體洩漏。

怎麼樣解決這個問題呢,我們隻要在Activity或者Fragment關閉的時候将Presenter中的引用釋放掉就可以了,但是如果有所的界面都去操作那樣就變得很麻煩,是以我們在BaseActivity或BaseFragment中去操作,具體代碼如下:

public abstract class BasePresenter<T> {

    protected Reference<T> mViewRef;//View接口類型弱引用

    public void attachView(T view) {
        mViewRef = new WeakReference<T>(view); //建立關聯
    }

    protected T getView() {
        return mViewRef.get();//擷取View
    }

    public boolean isViewAttached() {//判斷是否與View建立了關聯
        return mViewRef != null && mViewRef.get() != null;
    }

    public void detachView() {//解除關聯
        if (mViewRef != null) {
            mViewRef.clear();
            mViewRef = null;
        }
    }
}
           

這裡定義了四個方法,View通過泛型傳遞進來,Presenter對這個View持有弱引用。

public abstract class BaseActivity<V, T extends BasePresenter<V>> extends LibBaseActivity {

    protected T mPresenter;//Presenter對象

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = createPresenter();//建立Presenter
        mPresenter.attachView((V) this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.detachView();
    }

    protected abstract T createPresenter();

}
           

BaseActivity含有兩個泛型參數,第一個是View接口類型,第二個是Presenter的具體類型,在onCreate()中建立通過createPresenter建立一個具體的Presenter,在onDestroy()中釋放Presenter中的引用。