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

标签 android events rx-java

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

相关文章:

android - RxJava 平面图 : How to make multiple calls based on result from first call

java - Undertow + CompletableFuture/RxJava

java - RxJava 流 : conditional operators and error handling

java - 从截击 JSON 对象 POST 方法响应中捕获 cookie

android - 使用 buildozer 构建 Kivy APK 的问题

javascript - Seadragon 事件 - 事件触发时获取 Seadragon 查看器

Node.js 事件循环

fragment 中的 Android 动画不起作用

android - Gradle:MissingPropertyException:无法在 LibraryVariantImpl 上找到属性 'com'

android - setOnItemClickListener 事件不起作用