我基于RxJava实现了一个简单的事件总线,这篇文章:http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/
一切工作正常,除了我必须监听/触发来自适配器类的事件,该适配器类由 fragment 多次初始化。 由于我订阅了该适配器的每个实例,因此我的事件被多次触发,从而导致错误。
我只想订阅该适配器的 1 个实例,并且它必须是最后一个实例(而不是第一个实例)。 那么有没有一种方法,在生成适配器的新实例的情况下,我可以以某种方式检测我是否已经订阅并更新订阅(或删除该适配器的所有先前实例并仅订阅当前适配器)? 请注意,我还在其他 fragment/服务中使用了 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()
几毫秒。
关于android - RxAndroid 事件总线并避免从适配器发送重复的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32742051/