【问题标题】:RxAndroid Event Bus and avoid duplicated events sent from an AdapterRxAndroid 事件总线并避免从适配器发送重复事件
【发布时间】:2015-10-15 05:07:57
【问题描述】:

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

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

我只想订阅该适配器的 1 个实例,并且它必须是最后一个(而不是第一个)。 那么有没有一种方法,如果生成了适配器的新实例,我可以以某种方式检测我是否已经被订阅并更新订阅(或删除该适配器的所有先前的并订阅当前的)? 请注意,我还在我的其他片段/服务中使用了 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) {
                //...
            }
        }
    });

【问题讨论】:

  • 您收到什么错误?这些可能与io 订阅有关。订阅适配器可能难以维护,我建议将适配器视为加载项,而不是单独加载每个项目(或相同的行为) - 如果可能的话。
  • 我使用这个库:github.com/daimajia/AndroidSwipeLayout,它初始化了适配器 3 次。我得到的错误是我的应用程序错误,因为总线发送事件 3 次而不是一次。同样的情况也发生在 Otto 和 Greenrabit EventBus 上。作为副作用,swipelayout 不必要地被动画化了。

标签: android events rx-java


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 2023-03-23
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2022-01-15
    相关资源
    最近更新 更多