我们在使用rxjava请求网络的时候,会出现一种情况,当我们订阅后,activity销毁了,这个时候我们的activity就无法被收回,从而引发造成内存泄漏,对此我们可以使用RxLifecycle来管理activity的生命周期,是用步骤很简单,就三步,依赖、继承、绑定。
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(); } } 复制代码
我们使用compose操作符来绑定其生命周期,这里我们使用
compose((RxAppCompatActivity)context.bindUntilEvent(ActivityEvent.STOP)) 复制代码
compose(baseApi.getActivity().bindToLifecycle()) 复制代码
在说绑定原理之前首先提两个东西,
调用bindUntilEvent方法时,会传入两个参数,一个是BehaviorSubject,一个是我们设定的ActivityEvent,这里的BehaviorSubject上面说了是在订阅的时候将数据发送出去,BehaviorSubject在activity的时候会调用onNext将生命周期传入进去
再跟入bindUntilEvent方法,我们可以看到他执行了一个bind方法,并且bing方法中做了一个处理,去判断当前的生命周期与我们传入的生命周期是否相等,如果不相等,则不会将值发送到Subscriber
在bind方法中,创建了一个LifecycleTransformer并且传入observable,在LifecycleTransformer的构造中将这个observable存储为成员,用于takeUnti方法的执行(该方法的作用上面说了,如果observable发送了值过来就会自动取消订阅)
总结一下bindUntilEvent的生命周期绑定原理:就是运用到BehaviorSubject和takeUntil,当BehaviorSubject发送出来的生命周期与我们传入的生命周期相等的时候则取消订阅,不相等,则不取消,是否相等在过滤器(filter)中处理的