正在取消订阅 RxJava2/RxAndroid PublishSubject
Unsubscribing from RxJava2/RxAndroid PublishSubject
我正在尝试用 RxAndroid 替换 EventBus。
我希望可分页片段 subscribe/unsubscribe 到事件源,这些片段的创建和丢弃相对较快,具体取决于用户滑动到新页面的速度。
在 EventBus 中,我能够在片段的 onStart/onStop 方法中添加装饰回调方法(即 @Subscribe(threadMode = ThreadMode.MAIN)
)和 register/unregister。
我现在使用 RxJava2 在 class
中创建一个 PublishSubject
对象
public static PublishSubject<List<Long>> m_psUpdatedDays = PublishSubject.create();
public static void publishUpdatedDays(List<Long> lDay) {
m_psUpdatedDays.onNext(lDay);
}
并通过在 Fragment 的 onStart
方法中调用以下内容,在另一个 class 中订阅此发布者:
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() {}
});
我的问题是当系统调用Fragment的onStop
方法时,如何取消订阅这个新的Observer?
我是否需要存储我在 onSubscribe
中获得的 Disposable
对象,然后在 onStop
方法中对其调用 .dispose()
?
您可以使用 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
}
}
在你的片段中,使用 subscribeWith
方法订阅 Observable,这会立即给你一个 disposable
并且你可以稍后在 onPause
或 [=17] 中处理这个一次性的=] 事件(任何你想要的)
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
}
}
我正在尝试用 RxAndroid 替换 EventBus。
我希望可分页片段 subscribe/unsubscribe 到事件源,这些片段的创建和丢弃相对较快,具体取决于用户滑动到新页面的速度。
在 EventBus 中,我能够在片段的 onStart/onStop 方法中添加装饰回调方法(即 @Subscribe(threadMode = ThreadMode.MAIN)
)和 register/unregister。
我现在使用 RxJava2 在 class
中创建一个PublishSubject
对象
public static PublishSubject<List<Long>> m_psUpdatedDays = PublishSubject.create();
public static void publishUpdatedDays(List<Long> lDay) {
m_psUpdatedDays.onNext(lDay);
}
并通过在 Fragment 的 onStart
方法中调用以下内容,在另一个 class 中订阅此发布者:
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() {}
});
我的问题是当系统调用Fragment的onStop
方法时,如何取消订阅这个新的Observer?
我是否需要存储我在 onSubscribe
中获得的 Disposable
对象,然后在 onStop
方法中对其调用 .dispose()
?
您可以使用 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
}
}
在你的片段中,使用 subscribeWith
方法订阅 Observable,这会立即给你一个 disposable
并且你可以稍后在 onPause
或 [=17] 中处理这个一次性的=] 事件(任何你想要的)
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
}
}