0

我正在尝试实现 RxJava 事件总线,我的用例是在订阅和发送事件时触发。但是使用我的代码,即使我发送一次事件,我也会收到多个事件。它第一次工作正常,从我第二次登录我的应用程序开始就表现得很奇怪。IE; 第一次期望的代码实现了一次,第二次它实现了两次,依此类推。

public class RxBus {

    public RxBus() {
    }

    private PublishSubject<String> bus = PublishSubject.create();

    public void send(String str) {
        bus.onNext(str);
    }

    public Observable<String> toObservable() {
        return bus;
    }

}

订阅 RxBus 的代码如下:

public void sendEvents(){
        rxBus.send("Trigger event");
    }

 public void startListener(){
        rxBus.toObservable().subscribe(str -> {
           //do action//This is executing multiple lines
        });
    }

在上面的代码中,即使当 sendEvents() 被执行一次时,包含“do action”的行正在执行多次。那么,我在这里做错了什么。当我浏览一些博客时,他们要求在我们第二次访问该屏幕时取消订阅。但是我怎样才能取消订阅呢?

非常感谢您的帮助!

4

1 回答 1

0

简单的解决方案是声明一个字段:

SerialDisposable busDisposable = new SerialDisposable();

修改你的 startListener 方法:

public void startListener() {
    busDisposable.set(rxBus.toObservable().subscribe(str -> {
        // ...
    }));
}

这样,当您添加新订阅时,前一个订阅将被丢弃,因此您一次只能获得一个订阅。如果您的startListener调用不是由生命周期决定的,这很好。busDisposable.dispose()(当您不再想接收事件时,记得打电话。)

但是如果你调用你的startListenerin onResume/onStart/onCreate,你应该更好地使用Disposable而不是SerialDisposable简单地调用stopListener方法 in onPause/onStop/onDestroy

public void stopListener() {
    busDisposable.dispose();
}
于 2021-06-10T13:36:34.663 回答