RxAndroid事件总线,避免从适配器发送的重复事件



我基于RxJava和本文实现了一个简单的事件总线:http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/

一切都很好,除了我必须从适配器类中监听/触发事件,该适配器类由片段多次初始化。因为我订阅了该适配器的每个实例,所以我的事件被触发多次,导致错误。

我想只订阅该适配器的一个实例,它必须是最后一个(而不是第一个)。那么,是否有一种方法,在生成适配器的新实例的情况下,我可以以某种方式检测我是否已经订阅并更新订阅(或删除该适配器以前的所有订阅并仅订阅当前的订阅)?请注意,我也在我的其他片段/服务中使用rxBus单例,所以我不能简单地完全重置它,因为那样我会丢失所有其他不是来自适配器的订阅。

这是我的公共汽车代码:

public class APIRxBus {
private static APIRxBus instance = null;
private final Subject<Object, Object> bus = new SerializedSubject<>(BehaviorSubject.create());
public static APIRxBus getInstance() {
    if (instance == null){
        instance = new APIRxBus();
    }
    return instance;
}
public void send(Object o) {
    bus.onNext(o);
}
public Observable<Object> toObserverable() {
    return bus;
}

}

和我在适配器类中的订阅:

rxBus = APIRxBus.getInstance();
    rxBus.toObserverable()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Object>() {
        @Override
        public void call(Object event) {
            if (event instanceof EVTSetPrintMode) {
                //...
            } else if (event instanceof EVTChangeDocumentImportance) {
                //...
            } else if (event instanceof EVTChangeDocumentVisibility) {
                //...
            }
        }
    });

如果您可以判断两个后续事件是否相同,则可以使用distinctUntilChanged(Func1),否则,您可以尝试使用debounce()

相关内容

  • 没有找到相关文章

最新更新