RxJava:Rxlifecycle

RxJava:Rxlifecycle_第1张图片
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() {
                    @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.bindToLifecycle())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.d("flag", "onStart-------------");
                    }
                });
    }
 
 

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

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

该方案的源码解析

RxActivity

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

RxJava:Rxlifecycle_第2张图片
BehaviorSubject

RxJava:Rxlifecycle_第3张图片

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

RxJava:Rxlifecycle_第4张图片
RxJava:Rxlifecycle_第5张图片

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

RxJava:Rxlifecycle_第6张图片

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

RxJava:Rxlifecycle_第7张图片

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

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

你可能感兴趣的:(RxJava:Rxlifecycle)