BehaviorSubject 的 Missing BackPressure 示例是什么?

What is an example of MissingBackPressure for BehaviourSubject?

我有一个 android 应用程序使用 RxJava1.x,偶尔会在使用 BehaviourSubject 时抛出 MissingBackPressure

它只发出一个包含对象的列表来填充视图。

    behaviourSubject.onNext(items);

但是,重现异常非常困难,所以我尝试编写一个简单的测试如下。

    BehaviorSubject<Object> p = BehaviorSubject.create((Object)1);
    p.test(0).assertFailure(MissingBackpressureException.class);

有人可以帮忙举个例子吗?谢谢。

Caused by rx.exceptions.MissingBackpressureException
   at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.onNext(SourceFile:160)
   at rx.internal.operators.NotificationLite.accept(SourceFile:135)
   at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext(SourceFile:253)
   at rx.subjects.BehaviorSubject.onNext(SourceFile:160)
   ...
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(SourceFile:69)
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(SourceFile:77)
   at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError.onNext(SourceFile:41)
   at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError.onNext(SourceFile:38)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(SourceFile:173)
   at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.request(SourceFile:109)
   at rx.Subscriber.setProducer(SourceFile:211)
   at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.setProducer(SourceFile:105)
   at rx.Subscriber.setProducer(SourceFile:205)
   at rx.Subscriber.setProducer(SourceFile:205)
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(SourceFile:102)
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(SourceFile:102)
   at rx.Subscriber.setProducer(SourceFile:205)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(SourceFile:152)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(SourceFile:138)
   at rx.internal.operators.OnSubscribeLift.call(SourceFile:1048)
   at rx.Observable.unsafeSubscribe(SourceFile:10256)
   at rx.internal.operators.OnSubscribeMap.call(SourceFile:1048)
   at rx.Observable.unsafeSubscribe(SourceFile:10256)
   at rx.internal.operators.OnSubscribeMap.call(SourceFile:1048)
   at rx.internal.operators.OnSubscribeLift.call(SourceFile:1048)
   at rx.Observable.unsafeSubscribe(SourceFile:10256)
   at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(SourceFile:100)
   at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker.call(SourceFile:230)
   at rx.internal.schedulers.ScheduledAction.run(SourceFile:55)

1.x BehaviorSubject 忽略背压并在不考虑任何请求量的情况下发出,因此它永远不会发出信号 MissingBackpressureException。如果您在日志中看到这样的错误,那是来自另一个操作员;这就是为什么你应该总是 post 失败堆栈跟踪。

我不确定您为什么要针对此异常对 BehaviorSubject 本身进行单元测试,但最接近 MissingBackpressureException 信号的是 PublishSubject:

BehaviorSubject<Object> bs = BehaviorSubject.create((Object)1);

PublishSubject<Object> ps = PublishSubject.create();

AssertableSubscriber<Object> as = ps.test(0);

bs.subscribe(ps);

as.assertFailure(MissingBackpressureException.class);