RxAndroid - 正确使用 Rx EventBus
RxAndroid - Using Rx EventBus properly
我确实有这种行为
(根据 http://reactivex.io/documentation/subject.html 预计)
但在我的场景中:它是这样的:
我有一个显示通知的 AudioRecordingService,我可以在其中为用户提供保存或删除正在进行的录音的选项,它运行良好。但是我正在尝试使用 RxAndroid,我的通知的保存按钮会触发..
RxEventBus.getInstance().postEvent(new RxEvents(RxEventsEnum.AUDIO_STOP_AND_SAVE));
触发
bindUntilActivitySpecificEvent(RxEventBus.getInstance().forEventType(RxEvents.class),ActivityEvent.DESTROY).subscribeOn(
AndroidSchedulers.mainThread()).subscribe(new Action1<RxEvents>() {
@Override public void call(RxEvents rxEvents) {
onEvent(rxEvents);
}
});
并且在基于 rxEvents 对象数据的 onEvent(rxEvent) 中,我适当地保存和存储记录。我第一次尝试这个,它工作正常,但随后的时间,
@Override public void call(RxEvents rxEvents) {
onEvent(rxEvents);
}
被多次调用,例如我第二次 post 一个事件,这个回调被调用两次,第三次三次等等......(这实际上是 PublishSubject 所做的) .我不想要这种行为,我希望 Rx 能够 post 事件并且只接收最新的 posted 事件而不接收其他事件。
这是我的其他相关代码
protected final <T> Observable<T> bindUntilActivitySpecificEvent(Observable<T> observable,
ActivityEvent event) {
return observable.compose(RxLifecycle.<T, ActivityEvent>bindUntilEvent(lifecycle(), event))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
和我的 运行 工厂 RxEventBus class :
public class RxEventBus {
private static final RxEventBus INSTANCE = new RxEventBus();
public static RxEventBus getInstance() {
return INSTANCE;
}
private RxEventBus() {
}
private final Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());
public void postEvent(Object event) {
mBus.onNext(event);
}
public <T> Observable<T> forEventType(Class<T> eventType) {
return mBus.ofType(eventType).observeOn(AndroidSchedulers.mainThread());
}
}
使用 RxAndroid 的最佳方法是什么? 请注意,我只是在寻找 RxAndroid 解决方案。
每次在
中触发事件时,您都在创建一个新的可观察对象
RxEventBus.getInstance().forEventType(RxEvents.class)
您需要缓存为每种事件类型创建的可观察对象。
我确实有这种行为
(根据 http://reactivex.io/documentation/subject.html 预计)
但在我的场景中:它是这样的:
我有一个显示通知的 AudioRecordingService,我可以在其中为用户提供保存或删除正在进行的录音的选项,它运行良好。但是我正在尝试使用 RxAndroid,我的通知的保存按钮会触发..
RxEventBus.getInstance().postEvent(new RxEvents(RxEventsEnum.AUDIO_STOP_AND_SAVE));
触发
bindUntilActivitySpecificEvent(RxEventBus.getInstance().forEventType(RxEvents.class),ActivityEvent.DESTROY).subscribeOn(
AndroidSchedulers.mainThread()).subscribe(new Action1<RxEvents>() {
@Override public void call(RxEvents rxEvents) {
onEvent(rxEvents);
}
});
并且在基于 rxEvents 对象数据的 onEvent(rxEvent) 中,我适当地保存和存储记录。我第一次尝试这个,它工作正常,但随后的时间,
@Override public void call(RxEvents rxEvents) {
onEvent(rxEvents);
}
被多次调用,例如我第二次 post 一个事件,这个回调被调用两次,第三次三次等等......(这实际上是 PublishSubject 所做的) .我不想要这种行为,我希望 Rx 能够 post 事件并且只接收最新的 posted 事件而不接收其他事件。
这是我的其他相关代码
protected final <T> Observable<T> bindUntilActivitySpecificEvent(Observable<T> observable,
ActivityEvent event) {
return observable.compose(RxLifecycle.<T, ActivityEvent>bindUntilEvent(lifecycle(), event))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
和我的 运行 工厂 RxEventBus class :
public class RxEventBus {
private static final RxEventBus INSTANCE = new RxEventBus();
public static RxEventBus getInstance() {
return INSTANCE;
}
private RxEventBus() {
}
private final Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());
public void postEvent(Object event) {
mBus.onNext(event);
}
public <T> Observable<T> forEventType(Class<T> eventType) {
return mBus.ofType(eventType).observeOn(AndroidSchedulers.mainThread());
}
}
使用 RxAndroid 的最佳方法是什么? 请注意,我只是在寻找 RxAndroid 解决方案。
每次在
中触发事件时,您都在创建一个新的可观察对象RxEventBus.getInstance().forEventType(RxEvents.class)
您需要缓存为每种事件类型创建的可观察对象。