RxJava:Rxlifecycle

Photo by Peter Hershey on Unsplash

学无止境

Rxlifecycle是用于解决RxJava引起的内存泄漏的开源框架。

此次选择的方案:使用Rxlifecycler的组件和提供的RxActivity、RxFragment等类的子类

首先根据方案添加依赖:

    implementation 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
    implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'

然后继承RxActivityRxFragment

  • bindUntilEvent(ActivityEvent.STOP):手动设置在onPause()的时候取消订阅;
        Flowable.interval(2, TimeUnit.SECONDS)
                .compose(this.bindUntilEvent(ActivityEvent.STOP))
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.d("flag", "onStart-------------");
                    }
                });

bindToLifecycle()的自动取消订阅,如果在onStart()的时候调用,所以在onStop()的时候自动取消订阅;

    @Override
    protected void onStart() {
        super.onStart();

        //自动绑定生命周期
        Flowable.interval(2, TimeUnit.SECONDS)
                .compose(this.<Long>bindToLifecycle())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.d("flag", "onStart-------------");
                    }
                });
    }

RxLifecycle实际上并不取消订阅序列。而是终止序列。方式根据类型而有所不同:

  • ObservableFlowableMaybe:发射onCompleted()终止序列;
  • SingleCompletable:发射onError(CancellationException)终止序列;
    如果需要取消订阅,仍需手动取消;

该方案的源码解析

RxActivity

关于BehaviorSubject,作为Subject的实现类,拥有着它们的公共属性:既是观察者,也是被观察者
同时BehaviorSubject也拥有区别于其他三个实现类的特征:发送订阅之前一个数据和订阅之后的全部数据;如果没有数据就发送一个默认值

BehaviorSubject


上图中表示在Activity的所有生命周期方法中,lifecycleSubject通过onNext()将标志着生命周期的事件发射给下游;
发出的生命周期事件,如果和自己绑定的生命周期事件一样,那就终止序列,从而管理RxJava的生命周期;
.compose(this.bindUntilEvent(ActivityEvent.STOP))配置绑定终止序列的生命周期,其中bindUntilEvent()源码如下:

上文takeUntilEvent()filter()操作符来判断发射给下游的事件和自己绑定的生命周期是否一样,一样就继续向下游走;

takeUntil()操作符是关键,TakeUntil:当传入的那个被观察者发射数据的时候,当前这个被观察者就不再发射数据;

总结:当应用调用onStop()方法时,发射给下游的事件和绑定的事件一致,传入takeUntil()的被观察者就会发射数据,然后当前的被观察者就会终止序列;

对于RxJava的学习才刚刚开始!
RxJava:RxBus事件总线
RxJava:RxBinding
RxJava:Rxlifecycle

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容