转载

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)中处理的

原文  https://juejin.im/post/5d561752f265da03e05b0dec
正文到此结束
Loading...