学无止境
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
也拥有区别于其他三个实现类的特征:发送订阅之前一个数据和订阅之后的全部数据;如果没有数据就发送一个默认值
上图中表示在
Activity
的所有生命周期方法中,lifecycleSubject
通过onNext()
将标志着生命周期的事件发射给下游;发出的生命周期事件,如果和自己绑定的生命周期事件一样,那就终止序列,从而管理RxJava的生命周期;
.compose(this.bindUntilEvent(ActivityEvent.STOP))
配置绑定终止序列的生命周期,其中bindUntilEvent()
源码如下:
上文takeUntilEvent()
中filter()
操作符来判断发射给下游的事件和自己绑定的生命周期是否一样,一样就继续向下游走;
takeUntil()
操作符是关键,TakeUntil:当传入的那个被观察者发射数据的时候,当前这个被观察者就不再发射数据;
总结:当应用调用onStop()
方法时,发射给下游的事件和绑定的事件一致,传入takeUntil()
的被观察者就会发射数据,然后当前的被观察者就会终止序列;
对于RxJava的学习才刚刚开始!
RxJava:RxBus事件总线
RxJava:RxBinding
RxJava:Rxlifecycle