Mvp模式在封装的时候会造成内存泄漏,因为presenter层,需要做网络请求,所以就需要考虑到网络请求的取消操作,如果不处理,activity销毁了,presenter层还在请求网络,就会造成内存泄漏。
如何解决Mvp模式造成的内存泄漏?
只要presenter层能感知activity生命周期的变化,在activity销毁的时候,取消网络请求,就能解决这个问题。
下面开始封装activity和presenter。
定义IPresenter 声明activity(Fragment)生命周期中的各个回调方法
<U extends IUI> void init(BaseActivity activity, U ui);
/**
* onUICreate:UI被创建的时候应该invoke这个method. <br/>
* <p/>
* 比如Activity的onCreate()、Fragment的onCreateView()的方法应该调用Presenter的这个方法
*
* @param savedInstanceState 保存了的状态
*/
void onUICreate(Bundle savedInstanceState);
/**
* onUIStart:在UI被创建和被显示到屏幕之间应该回调这个方法. <br/>
* <p/>
* 比如Activity的onStart()方法应该调用Presenter的这个方法
*/
void onUIStart();
/**
* onUIResume:在UI被显示到屏幕的时候应该回调这个方法. <br/>
* <p/>
* 比如Activity的onResume()方法应该调用Presenter的这个方法
*/
void onUIResume();
/**
* onUIPause:在UI从屏幕上消失的时候应该回调这个方法. <br/>
* <p/>
* 比如Activity的onPause()方法应该调用Presenter的这个方法
*/
void onUIPause();
/**
* onUIStop:在UI从屏幕完全隐藏应该回调这个方法. <br/>
* <p/>
* 比如Activity的onStop()方法应该调用Presenter的这个方法
*/
void onUIStop();
/**
* onUIDestroy:当UI被Destory的时候应该回调这个方法. <br/>
*/
void onUIDestroy();
/**
* onSaveInstanceState:保存数据. <br/>
* <p/>
* 一般是因为内存不足UI的状态被回收的时候调用
*
* @param outState 待保存的状态
*/
void onSaveInstanceState(Bundle outState);
/**
* onRestoreInstanceState:当UI被恢复的时候被调用. <br/>
*
* @param savedInstanceState 保存了的状态
*/
void onRestoreInstanceState(Bundle savedInstanceState);
封装BaseActivity
拥有一个 protected P mPresenter实例,类型写成泛型,protected修饰,子类实现
构造方法中,对mPresenter进行实例化:采用反射的形式(避免让子类进行实例化,繁琐)
public abstract class BaseMVPActivity<P extends IPresenter> extends BaseActivity {
protected P mPresenter;
public BaseMVPActivity(){
this.mPresenter = createPresenter();
}
protected P createPresenter(){
ParameterizedType type = (ParameterizedType)(getClass().getGenericSuperclass());
if(type == null){
return null;
}
Type[] typeArray = type.getActualTypeArguments();
if(typeArray.length == 0){
return null;
}
Class<P> clazz = (Class<P>) typeArray[0];
try {
return clazz.newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onDestroy() {
mPresenter.onUIDestroy();
super.onDestroy();
}
封装BasePresenter
3.定义BasePresenter,页面销毁的回调里面。处理网络请求
定义一个集合,把每次网络请求装载到集合里面,在页面销毁的时候,取消所有的网络请求。防止内存泄漏。
public abstract class BasePresenter<U extends IUI> implements IPresenter {
@Override
public void onUIDestroy() {
// 清空Call列表,并放弃Call请求
clearAndCancelCallList();
}
}