【问题标题】:RxAndroid - Using Rx EventBus properlyRxAndroid - 正确使用 Rx EventBus
【发布时间】:2016-05-22 06:09:02
【问题描述】:

我就是有这种行为

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);
      }
    });

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

@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 解决方案。

【问题讨论】:

  • 好像你在某处添加了多个回调监听器。如果它被多次调用。
  • 不,我没有,我检查了所有参考资料????

标签: android rx-java observer-pattern observable rx-android


【解决方案1】:

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

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

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

【讨论】:

  • 我认为你是对的,我现在正在订阅 onResume(),我必须在 onCreate() 中订阅,我会试一试
  • 那行得通,我的错,正如聪明人所说的“犯错是人类”哈哈,谢谢
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多