Rxlifecycle 中提供了 RxAppCompatActivity

使用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
  1. 添加包引用
    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'
  1. 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();
    }
}
  1. 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);
……

此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!

猜你喜欢

转载自blog.csdn.net/kingyc123456789/article/details/107358115