安卓学习Android框架Android开发学习

MVP模式下使用RxLifecycle管理RxJava

2018-08-08  本文已影响369人  耀东wang

现在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();
}
上一篇下一篇

猜你喜欢

热点阅读