RxJava 作为事件总线被多次调用,即使只触发一次
RxJava as event bus is called multiple times even when only once triggered
我正在尝试实现 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”的行执行了多次。所以,我在这里做错了什么。当我浏览一些博客时,他们要求在我们第二次访问该屏幕时取消订阅。但是我怎样才能取消订阅呢?
非常感谢您的帮助!
简单的解决方案是声明一个字段:
SerialDisposable busDisposable = new SerialDisposable();
修改你的startListener方法:
public void startListener() {
busDisposable.set(rxBus.toObservable().subscribe(str -> {
// ...
}));
}
这样一来,当您添加新订阅时,之前的订阅将被处理掉,因此您最终一次只会有一个订阅。如果您的 startListener
调用不是由生命周期决定的,这很好。 (当您不想再接收事件时,记得拨打 busDisposable.dispose()
。)
但是如果你在onResume/onStart/onCreate
中调用你的startListener
,你最好使用Disposable
而不是SerialDisposable
并且简单地在[=中调用stopListener
方法20=].
public void stopListener() {
busDisposable.dispose();
}
我正在尝试实现 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”的行执行了多次。所以,我在这里做错了什么。当我浏览一些博客时,他们要求在我们第二次访问该屏幕时取消订阅。但是我怎样才能取消订阅呢?
非常感谢您的帮助!
简单的解决方案是声明一个字段:
SerialDisposable busDisposable = new SerialDisposable();
修改你的startListener方法:
public void startListener() {
busDisposable.set(rxBus.toObservable().subscribe(str -> {
// ...
}));
}
这样一来,当您添加新订阅时,之前的订阅将被处理掉,因此您最终一次只会有一个订阅。如果您的 startListener
调用不是由生命周期决定的,这很好。 (当您不想再接收事件时,记得拨打 busDisposable.dispose()
。)
但是如果你在onResume/onStart/onCreate
中调用你的startListener
,你最好使用Disposable
而不是SerialDisposable
并且简单地在[=中调用stopListener
方法20=].
public void stopListener() {
busDisposable.dispose();
}