Rxjava2生命周期绑定


    我们在使用rxjava请求网络的时候,会出现一种情况,当我们订阅后,activity销毁了,这个时候我们的activity就无法被收回,从而引发造成内存泄漏,对此我们可以使用RxLifecycle来管理activity的生命周期,是用步骤很简单,就三步,依赖、继承、绑定。

使用步骤

依赖RxLifecycle

    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也提供了相应的继承类

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();
    }
}

绑定Activity

我们使用compose操作符来绑定其生命周期,这里我们使用

  1. 使用bindUntilEvent绑定,传入的参数有六种,对应activity的生命周期, CREATE, START, RESUME, PAUSE, STOP, DESTROY,我们想让其在什么时候取消订阅就传入对应的生命周期就好了,如以下例子为当生命周期处于stop的时候,取消订阅
compose((RxAppCompatActivity)context.bindUntilEvent(ActivityEvent.STOP))
  1. 使用bindToLifecycle方法绑定,这种方法跟随者activity的生命周期,当activity销毁的时候取消订阅
compose(baseApi.getActivity().bindToLifecycle())

绑定原理

在说绑定原理之前首先提两个东西,

  1. BehaviorSubject,这个Subject是官方提供的,作用是“释放订阅前最后一个数据和订阅后接收到的所有数据”,简单的说,他就是onNext来存储数据,然后在订阅的时候将数据发送出去。这个类暂时理解到这。
  2. takeUntil操作符,“当第二个Observable发射了一项数据或者终止时,丢弃原Observable发射的任何数据”。这个说明白一点就是当收到某个observable的某个事件时,自动取消订阅(某个observable就是BehaviorSubject)

bindUntilEvent绑定原理

    调用bindUntilEvent方法时,会传入两个参数,一个是BehaviorSubject,一个是我们设定的ActivityEvent,这里的BehaviorSubject上面说了是在订阅的时候将数据发送出去,BehaviorSubject在activity的时候会调用onNext将生命周期传入进去
Rxjava2生命周期绑定
Rxjava2生命周期绑定

    再跟入bindUntilEvent方法,我们可以看到他执行了一个bind方法,并且bing方法中做了一个处理,去判断当前的生命周期与我们传入的生命周期是否相等,如果不相等,则不会将值发送到Subscriber

Rxjava2生命周期绑定
    在bind方法中,创建了一个LifecycleTransformer并且传入observable,在LifecycleTransformer的构造中将这个observable存储为成员,用于takeUnti方法的执行(该方法的作用上面说了,如果observable发送了值过来就会自动取消订阅)

    总结一下bindUntilEvent的生命周期绑定原理:就是运用到BehaviorSubject和takeUntil,当BehaviorSubject发送出来的生命周期与我们传入的生命周期相等的时候则取消订阅,不相等,则不取消,是否相等在过滤器(filter)中处理的

bindToLifecycle绑定原理

    根据当前的生命周期,来进行运算得到一个新的序列,这个序列为boolean序列,当为true的时候则取消订阅,核心方法为takeUntilCorrespondingEvent方法中的combineLatest
combineLatest参数

  1. lifecycle.take(1)指的是最近发射的事件

    这里就是指ACTIVITY_LIFECYCLE中对应的参数,如果当前生命周期为create,则返回的是ActivityEvent.DESTROY

  2. lifecycle.skip(1)指除去第一个保留剩下的

    这里就是指我们除去我们当前的生命周期,剩下的,例如我们当前处于create中执行了bindToLifecycle,则六个生命周期中就去除掉create,剩下的五个

  3. 第三个参数 意味着,lifecycle.take(1).map(correspondingEvents)的序列和 lifecycle.skip(1)进行combine,形成一个新的序列

    我们用ACTIVITY_LIFECYCLE中得到的对应的参数去与我们第二个参数中的得到的剩下的生命周期序列做比较,然后得到一串Boolean序列,当为true的时候则取消订阅

Rxjava2生命周期绑定

Rxjava2生命周期绑定