咱们在使用rxjava请求网络的时候,会出现一种状况,当咱们订阅后,activity销毁了,这个时候咱们的activity就没法被收回,从而引起形成内存泄漏,对此咱们可使用RxLifecycle来管理activity的生命周期,是用步骤很简单,就三步,依赖、继承、绑定。java
compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
复制代码
继承RxAppCompatActivity或RxFragmentActivity等等,fragment也提供了相应的继承类android
public class BaseActivity extends RxAppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
复制代码
咱们使用compose操做符来绑定其生命周期,这里咱们使用bash
compose((RxAppCompatActivity)context.bindUntilEvent(ActivityEvent.STOP))
复制代码
compose(baseApi.getActivity().bindToLifecycle())
复制代码
在说绑定原理以前首先提两个东西,网络
调用bindUntilEvent方法时,会传入两个参数,一个是BehaviorSubject,一个是咱们设定的ActivityEvent,这里的BehaviorSubject上面说了是在订阅的时候将数据发送出去,BehaviorSubject在activity的时候会调用onNext将生命周期传入进去 ide
再跟入bindUntilEvent方法,咱们能够看到他执行了一个bind方法,而且bing方法中作了一个处理,去判断当前的生命周期与咱们传入的生命周期是否相等,若是不相等,则不会将值发送到Subscriberspa
总结一下bindUntilEvent的生命周期绑定原理:就是运用到BehaviorSubject和takeUntil,当BehaviorSubject发送出来的生命周期与咱们传入的生命周期相等的时候则取消订阅,不相等,则不取消,是否相等在过滤器(filter)中处理的code
根据当前的生命周期,来进行运算获得一个新的序列,这个序列为boolean序列,当为true的时候则取消订阅,核心方法为takeUntilCorrespondingEvent方法中的combineLatest combineLatest参数component
lifecycle.take(1)指的是最近发射的事件orm
这里就是指ACTIVITY_LIFECYCLE中对应的参数,若是当前生命周期为create,则返回的是ActivityEvent.DESTROYcdn
lifecycle.skip(1)指除去第一个保留剩下的
这里就是指咱们除去咱们当前的生命周期,剩下的,例如咱们当前处于create中执行了bindToLifecycle,则六个生命周期中就去除掉create,剩下的五个
第三个参数 意味着,lifecycle.take(1).map(correspondingEvents)的序列和 lifecycle.skip(1)进行combine,造成一个新的序列
咱们用ACTIVITY_LIFECYCLE中获得的对应的参数去与咱们第二个参数中的获得的剩下的生命周期序列作比较,而后获得一串Boolean序列,当为true的时候则取消订阅