gpt4 book ai didi

android - RxAndroid 事件总线并避免从适配器发送重复事件

转载 作者:行者123 更新时间:2023-11-29 01:28:05 27 4
gpt4 key购买 nike

我基于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com