RxJava 作为 Android 项目中的事件总线 - 从总线中删除事件
RxJava as event bus in Android project - remove event from the bus
之前用EventBus工作过,很好用,也很容易理解。然而,这一次,我想尝试使用 RxJava 进行类似事件总线的通信,但是目前还不太清楚如何从 RxJava 中删除事件,或者更确切地说,应该如何正确设计它以具有与 EventBus 类似的行为当我打电话给 removeStickyEvent
?
在RxJava中,即使我订阅了这个observable,我也可以使用BehaviorSubject来最后回复,但是当这个事件被处理时我该怎么办?如果我不想再次重播此事件怎么办?
例如,一个片段触发一个事件然后结束。另一个片段监听这个事件并处理它。然后,如果此应用程序在不同情况下再次触发 "another" activity,那么它将再次订阅相同的 BehaviorSubject 并再次处理该陈旧事件,这不是我想要实现的。
只要你不打算让你的 events
成为 null
,我认为这很容易实现。
正如你所说,你可以使用 BehaviorSubject
传播 sticky
事件,当你想从 bus
传播 removeStickyEvent
时,你可以发出一个null
对象(对 "flush" subject
)。
类似这样的事情(来自我的脑海 - 未经测试,没有泛型,只是一个简单的 Object
基于事件的示例):
public class RxEventBus {
PublishSubject<Object> eventsSubject = PublishSubject.create();
BehaviorSubject<Object> stickyEventsSubject = BehaviorSubject.create();
public RxEventBus() {
}
public Observable<Object> asObservable() {
return eventsSubject;
}
public Observable<Object> asStickyObservable() {
return stickyEventsSubject.filter(new Func1<Object, Boolean>() {
@Override
public Boolean call(Object o) {
return o != null;
}
});
}
public void postEvent(@NonNull Object event) {
eventsSubject.onNext(event);
}
public void postStickyEvent(@NonNull Object stickyEvent) {
stickyEventsSubject.onNext(stickyEvent);
}
public void removeStickyEvent(){
stickyEventsSubject.onNext(null);
}
}
之前用EventBus工作过,很好用,也很容易理解。然而,这一次,我想尝试使用 RxJava 进行类似事件总线的通信,但是目前还不太清楚如何从 RxJava 中删除事件,或者更确切地说,应该如何正确设计它以具有与 EventBus 类似的行为当我打电话给 removeStickyEvent
?
在RxJava中,即使我订阅了这个observable,我也可以使用BehaviorSubject来最后回复,但是当这个事件被处理时我该怎么办?如果我不想再次重播此事件怎么办?
例如,一个片段触发一个事件然后结束。另一个片段监听这个事件并处理它。然后,如果此应用程序在不同情况下再次触发 "another" activity,那么它将再次订阅相同的 BehaviorSubject 并再次处理该陈旧事件,这不是我想要实现的。
只要你不打算让你的 events
成为 null
,我认为这很容易实现。
正如你所说,你可以使用 BehaviorSubject
传播 sticky
事件,当你想从 bus
传播 removeStickyEvent
时,你可以发出一个null
对象(对 "flush" subject
)。
类似这样的事情(来自我的脑海 - 未经测试,没有泛型,只是一个简单的 Object
基于事件的示例):
public class RxEventBus {
PublishSubject<Object> eventsSubject = PublishSubject.create();
BehaviorSubject<Object> stickyEventsSubject = BehaviorSubject.create();
public RxEventBus() {
}
public Observable<Object> asObservable() {
return eventsSubject;
}
public Observable<Object> asStickyObservable() {
return stickyEventsSubject.filter(new Func1<Object, Boolean>() {
@Override
public Boolean call(Object o) {
return o != null;
}
});
}
public void postEvent(@NonNull Object event) {
eventsSubject.onNext(event);
}
public void postStickyEvent(@NonNull Object stickyEvent) {
stickyEventsSubject.onNext(stickyEvent);
}
public void removeStickyEvent(){
stickyEventsSubject.onNext(null);
}
}