
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'
然后继承RxActivity,RxFragment;
-
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实际上并不取消订阅序列。而是终止序列。方式根据类型而有所不同:
-
Observable,Flowable和Maybe:发射onCompleted()终止序列; -
Single和Completable:发射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