现在MVP模式越来越流行了,使用起来很方便,这样的话我们会更加的专注于业务。现在很多人也开始爱上了RxJava了,但是在使用RxJava时我们要注意的是防止内存泄露,因为当Activity已经finish的时候如果这是订阅关系还没有取消,那么这个时候就会发生内存泄漏,更严重的是,这个时候如果我们还继续更新界面,那么程序就可能报空指针,因为这是相应的UI元素已经销毁了,所以这点我们是需要注意的,那怎么才能够安全的使用RxJava了,这个时候RxLifeCycle就派上用场了,原理其实很简单我们只需要绑定Activity或者Fragment的生命周期就可以了。下面我们谈谈在MVP模式下,如何使用RxLifeCycle。
首先我们需要添加对应的依赖,如下:
/**
* rxLifecycle
*/
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.0.1'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
这里我们要用到LifecycleProvide这个接口。值得一提的是这个接口已经在RxAppCompatActivity中实现了,所以我们BaseActivity可以很方便的继承RxAppCompatActivity,赋予接口引用就可以使用它了。
我的做法是在BasePresenter中去构建接口对象:
public abstract class BasePresenter<T> {
/**
* 这里可以初始化View接口
*/
public T view;
private LifecycleProvider<ActivityEvent>provider;
/**
*
* @param view Activity或者Fragment中的引用this
*/
public void attach(T view){
this.view=view;
}
public void detach(){
this.view=null;
}
public BasePresenter(LifecycleProvider<ActivityEvent>provider){
this.provider=provider;
}
public LifecycleProvider<ActivityEvent> getProvider() {
return provider;
}
public void setProvider(LifecycleProvider<ActivityEvent> provider) {
this.provider = provider;
}
}
业务层的使用如下:
public class NetWorkPresenter extends BasePresenter<NetWorkView>{
public NetWorkPresenter(LifecycleProvider<ActivityEvent> provider) {
super(provider);
}
public void getData(PageParmForm pageParmForm, Context mContext){
new NetRepository().getApplication(pageParmForm)
.compose(getProvider().<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new BaseObserver<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>(mContext) {
@Override
public void onError(ExceptionHandle.ResponseException exception) {
view.toast(exception.getMessage());
}
@Override
public void onNext(UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>> Response) {
view.showApplicationList(Response);
Log.d("lifecycle","pause");
}
@Override
public void onSubscribe(Disposable d) {
}
});
}
}
所以我们在Activity中实例化中直接传this就可以了
@Override
public NetWorkPresenter initPresenter() {
return new NetWorkPresenter(this);
}
在Activity中的使用如下:
public void initData(){
new NetRepository().getApplication(new PageParmForm(Constant.orderStr,Constant.pageNum,Constant.pageSize))
.compose(this.<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>bindUntilEvent(ActivityEvent.PAUSE))//指定订阅再PAUSE的时候呢,取消订阅
.subscribe(new BaseObserver<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>(NetWorkActivity.this) {
@Override
public void onError(ExceptionHandle.ResponseException exception) {
myToast.showToast(NetWorkActivity.this,exception.getMessage());
}
@Override
public void onNext(UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>> Response) {
data=Response.getData().getList();
code=Response.getCode();
generateAdapter.setData(data);
generateAdapter.notifyDataSetChanged();
}
});
}
这样使用起来就很简单
顺便贴一下mvpActivity:
public abstract class MvpActivity<V,P extends BasePresenter<V>> extends BaseActivity {
protected P presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter=initPresenter();//实例化Presenter
presenter.attach((V) this);//实例化接口引用
}
@Override
protected void onResume() {
super.onResume();
presenter.attach((V) this);//绑定view接口,相当于拿到接口的引用
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detach();//耗时操作在这里也结束
}
//实例化Presenter
public abstract P initPresenter();
}