退订RxJava2 / RxAndroid PublishSubject

Dan*_*l F 5 publish-subscribe event-bus rx-android rx-java2

我正在尝试用RxAndroid替换EventBus。

我希望可分页的片段订阅/取消订阅事件源,这些片段的创建和丢弃相对较快,具体取决于用户滑动到新页面的速度。

在EventBus中,我能够添加修饰的回调方法(例如@Subscribe(threadMode = ThreadMode.MAIN)),并在片段的onStart / onStop方法中注册/注销。

现在,使用RxJava2 PublishSubject在类中创建一个对象

public static PublishSubject<List<Long>> m_psUpdatedDays = PublishSubject.create();
public static void publishUpdatedDays(List<Long> lDay) {
    m_psUpdatedDays.onNext(lDay);
}
Run Code Online (Sandbox Code Playgroud)

并通过Fragment的onStart方法调用以下内容来订阅该发布者在另一个类中的操作:

m_psUpdatedDays.observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<Long>>() {
    @Override public void onSubscribe(Disposable d) {}
    @Override public void onNext(List<Long> longs) {
      ...
      Update Fragment UI here
      ...
    }
    @Override public void onError(Throwable e) {}
    @Override public void onComplete() {}
});
Run Code Online (Sandbox Code Playgroud)

我的问题是,当onStop系统调用Fragment的方法时,如何取消订阅该新的Observer ?

我是否需要存储Disposable获取到的对象,onSubscribe然后.dispose()onStop方法中对其进行调用?

Sar*_* Kn 7

您可以使用一个CompositeDisposable对象,该对象可以保存一次性物品清单,并且所有物品都可以放在一起。

CompositeDisposable在基本片段级别创建一个实例,继续将一次性对象添加到其中。

    public abstract class BaseFragment extends Fragment {
        protected CompositeDisposable mCompositeDisposable = new CompositeDisposable();

        @Override
        public void onPause() {
            super.onPause();
            mCompositeDisposable.clear();
            //clear will clear all, but can accept new disposable.
            // You can call it on `onPause` or `orDestroyView` events.
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            mCompositeDisposable.dispose();
            //dispose will clear all and set isDisposed = true, so it will not accept any new disposable
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的片段中,使用subscribeWith方法订阅Observable,该方法会disposable立即为您提供此可抛弃对象,您可以稍后在onPauseonDestroy事件中处置它(任意位置)

     public class MyFragment extends BaseFragment {


            @Override
            public void onStart() {
                super.onStart();
                Disposable disposable = m_psUpdatedDays.observeOn(AndroidSchedulers.mainThread())
                        .subscribeWith(new DisposableObserver<List<Long>>() { // Use `subscribeWith` instead of `subscribe`, which will give you back the disposable , which can be disposed later
                            @Override
                            public void onNext(List<Long> longs) {
                                // Update Fragment UI here
                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onComplete() {

                            }
                        });
                mCompositeDisposable.add(disposable); // add the disposable to the disposable list
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 使用带有`subscribeWith`的CompositeDisposable和您的实现实际上是相同的。但是当您有多个订阅时,`CompositeDisposable`就变得很方便。“ CompositeDisposable”可以容纳您的所有一次性物品,并且一步一步取消订阅。同样,`subscribeWith`减少了观察者回调`void onSubscribe(Disposable d)`中的一种方法,以使观察者变短。 (2认同)