gpt4 book ai didi

android - RxAndroid - 正确使用 Rx EventBus

转载 作者:行者123 更新时间:2023-11-30 01:19:16 24 4
gpt4 key购买 nike

我确实有这种行为

Subscriber OnComplete called twice

(根据 http://reactivex.io/documentation/subject.html 预计)

但在我的场景中:它是这样的:

我有一个显示通知的 AudioRecordingService,我可以在其中为用户提供保存或删除正在进行的录音的选项,它运行良好。但是我正在尝试使用 RxAndroid,我的通知的保存按钮会触发..

RxEventBus.getInstance().postEvent(new RxEvents(RxEventsEnum.AUDIO_STOP_AND_SAVE));

触发

bindUntilActivitySpecificEvent(RxEventBus.getInstance().forEventType(RxEvents.class),ActivityEvent.DESTROY).subscribeOn(
AndroidSchedulers.mainThread()).subscribe(new Action1<RxEvents>() {
@Override public void call(RxEvents rxEvents) {
onEvent(rxEvents);
}
});

在基于 rxEvents 对象数据的 onEvent(rxEvent) 中,我适本地保存和存储记录。我第一次尝试这个,它工作正常,但随后的时间,

@Override public void call(RxEvents rxEvents) {
onEvent(rxEvents);
}

被多次调用,例如我第二次发布事件时,此回调被调用两次,第三次三次等等……(这实际上是 PublishSubject 所做的)。我不想要这种行为,我希望 Rx 能够发布事件并只接收发布的最新事件,而不接收其他任何内容。

这是我的其他相关代码

protected final <T> Observable<T> bindUntilActivitySpecificEvent(Observable<T> observable,
ActivityEvent event) {
return observable.compose(RxLifecycle.<T, ActivityEvent>bindUntilEvent(lifecycle(), event))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}

还有我常用的 RxEventBus 类:

public class RxEventBus {

private static final RxEventBus INSTANCE = new RxEventBus();

public static RxEventBus getInstance() {
return INSTANCE;
}

private RxEventBus() {
}

private final Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());


public void postEvent(Object event) {
mBus.onNext(event);
}

public <T> Observable<T> forEventType(Class<T> eventType) {
return mBus.ofType(eventType).observeOn(AndroidSchedulers.mainThread());
}
}

使用 RxAndroid 的最佳方法是什么? 请注意,我只是在寻找 RxAndroid 解决方案。

最佳答案

每次触发事件时,您都在创建一个新的可观察对象

RxEventBus.getInstance().forEventType(RxEvents.class)

您需要缓存为每种事件类型创建的可观察对象。

关于android - RxAndroid - 正确使用 Rx EventBus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37371145/

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