MVP造成的内存泄漏
2019-02-19 本文已影响64人
天平GG
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中的引用。