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中的引用。