使用Rxjava的Observable,Flowable等可观察对象时,常常遇到的场景: Activity,Fragment等结束生命周期时,需要停止执行Observable对象,防止内存泄漏
- 一种常用的做法是,在onDestroy()中调用Disposable的dispose()方法,代码如下:
//Activity或者Fragment中
@Override
protected void onDestroy() {
super.onDestroy();
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
- 有没有更好的方式,显然是有的,使用Rxlifecycle
- 添加包引用
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
- Activity,Fragment分别继承RxAppCompatActivity,RxFragment
下面贴出的是RxAppCompatActivity的代码,可以看到在Activity的生命周期方法里面都向lifecycleSubject 中发出了对应的事件,这样lifecycleSubject 就可以感知到Activity生命周期的变化;RxFragment也是一样的
//RxAppCompatActivity.java 在rxlifecycle-components:2.2.这个包里面
public abstract class RxAppCompatActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
@Override
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@Override
@CallSuper
protected void onStart() {
super.onStart();
lifecycleSubject.onNext(ActivityEvent.START);
}
@Override
@CallSuper
protected void onResume() {
super.onResume();
lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override
@CallSuper
protected void onPause() {
lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
protected void onStop() {
lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
@Override
@CallSuper
protected void onDestroy() {
lifecycleSubject.onNext(ActivityEvent.DESTROY);
super.onDestroy();
}
}
- Observable,Flowable等中添加生命周期感知能力
这里就拿Observable来举例,activity为对应的RxAppCompatActivity 实例,bindUntilEvent(ActivityEvent.DESTROY)这个方法的意思是到达ActivityEvent.DESTROY生命周期就停止Observable事件流;细心的同学发现RxAppCompatActivity 中还有一个bindToLifecycle()方法,这个方法就是将数据流和Activity生命周期完全绑定,在可见的时候发送数据,在不可见的时候停止发送数据
Observable.just(1)
.compose(activity.bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
不继承RxAppCompatActivity,RxFragment的情况下使用RxLifeCycle
从上面的RxAppCompatActivity中可以知道主要功能就是以下代码,只需要将代码移植到自己的Activity中就行了
//关键实现
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
//发送对应生命周期事件
lifecycleSubject.onNext(ActivityEvent.CREATE);
lifecycleSubject.onNext(ActivityEvent.START);
……
此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!