Rx java 订阅热可观测数据,无需完成

Rx java 订阅热可观测数据,无需完成,rx-java,rx-java2,Rx Java,Rx Java2,我无法使用正确的语法来执行以下操作: 创建一个只执行一次且从不调用onComplete的热可观察对象 让不同的可观测对象收听并响应热可观测对象发出的数据,而不强迫热可观测对象调用onComplete 下面是一个简化的例子: // Create an observable that never calls onComplete and keeps spitting out data Observable<Foo> hotObservable = Observable.create(em

我无法使用正确的语法来执行以下操作:

  • 创建一个只执行一次且从不调用onComplete的热可观察对象
  • 让不同的可观测对象收听并响应热可观测对象发出的数据,而不强迫热可观测对象调用onComplete
  • 下面是一个简化的例子:

    // Create an observable that never calls onComplete and keeps spitting out data
    Observable<Foo> hotObservable = Observable.create(emitter -> {
       while (true) {
         Foo someData = listenToInputStream();
         emitter.onNext(someData);
       }
    }
    
    // Ensure observable is fired off immediately
    ConnectableObservable cObs = hotObservable
      .subscribeOn(Schedulers.io())
      .publish();
    cObs.connect();
    
    Single<Foo> obs1 = cObs
     .subscribeOn(Schedulers.io())
     .doOnSubscribe(x -> triggerObs1EventToBeSentToInputStream)
     .filter(someFilter)
     .singleOrError();
    obs1.subscribe(someConsumer);
    
    Single<Bar> obs2 = cObs
     .subscribeOn(Schedulers.io())
     .doOnSubscribe(x -> triggerObs2EventToBeSentToInputStream)
     .filter(someOtherFilter)
     .map(fooToBar)
     .singleOrError();
    obs2.subscribe(someOtherConsumer);
    
    //创建一个从不调用onComplete并不断吐出数据的可观察对象
    可观测的热可观测=可观测的。创建(发射器->{
    while(true){
    Foo someData=listenToInputStream();
    emitter.onNext(someData);
    }
    }
    //确保observable立即启动
    可连接可观察cObs=热可观察
    .subscribeOn(Schedulers.io())
    .publish();
    cObs.connect();
    单obs1=cObs
    .subscribeOn(Schedulers.io())
    .doOnSubscribe(x->TriggerObs1EventToBeentToInputStream)
    .filter(someFilter)
    .singleOrError();
    obs1.订阅(someConsumer);
    单obs2=cObs
    .subscribeOn(Schedulers.io())
    .doOnSubscribe(x->TriggerObs2EventToBeentToInputStream)
    .filter(someOtherFilter)
    .地图(fooToBar)
    .singleOrError();
    obs2.订阅(其他消费者);
    
    我看到firstOrError()可以工作,但singleOrError()/lastOrError()/.takeLast(1)不能。有没有一种方法可以在不阻塞/挂起的情况下获取与筛选条件匹配的最新版本

    FWIW,如果我使用.take(1).singleOrError()它会通过,但我假设它与firstOrError()相同。我正在查找与该过滤器匹配的最新发出的数据


    我还有其他的观测者,他们可以监听热可观测对象发出的任何数量/类型的数据,因此我为这些特定的观测者调用doOnSubscribe,而不是将输入流直接集成到观测者本身。

    根据天网的主题思想,我认为如果我使用PublishSubject,它会起到一定的作用作为一个中间人。目前它的工作方式有点像take(),但我想我可以扩展到更灵活的方式,返回1到N个项目

    例如:

    PublishSubject<Foo> pSubj = PublishSubject.create();
    cObjs
    .filter(getCorrectData)
    .doOnSubscribe(x -> triggerEventToBeSentToInputStream)
    .subscribe(x -> {
      pSubj.onNext(x);
      pSubj.complete();
    });
    
    Single<Foo> obs1 = pSubj
     .subscribeOn(Schedulers.io())
     //etc 
    
    PublishSubject pSubj=PublishSubject.create();
    眼镜蛇
    .filter(getCorrectData)
    .doOnSubscribe(x->TriggerEventToBeentToInputStream)
    .订阅(x->{
    pSubj.onNext(x);
    pSubj.complete();
    });
    单obs1=pSubj
    .subscribeOn(Schedulers.io())
    //等
    
    根据Skynets的主题思想,我认为如果我使用PublishSubject作为中间人,它会有点效果。目前它的工作方式有点像take(),但我想我可以扩展到更灵活,返回1到N个项目

    例如:

    PublishSubject<Foo> pSubj = PublishSubject.create();
    cObjs
    .filter(getCorrectData)
    .doOnSubscribe(x -> triggerEventToBeSentToInputStream)
    .subscribe(x -> {
      pSubj.onNext(x);
      pSubj.complete();
    });
    
    Single<Foo> obs1 = pSubj
     .subscribeOn(Schedulers.io())
     //etc 
    
    PublishSubject pSubj=PublishSubject.create();
    眼镜蛇
    .filter(getCorrectData)
    .doOnSubscribe(x->TriggerEventToBeentToInputStream)
    .订阅(x->{
    pSubj.onNext(x);
    pSubj.complete();
    });
    单obs1=pSubj
    .subscribeOn(Schedulers.io())
    //等
    
    您确定要使用
    单次
    ?听起来您对多个事件感兴趣,
    单次
    发出一个事件(成功或错误),并且该事件是终端。while(true)在任何代码库中,都应该发出警报!您是否检查过RX Subject是否是一个好的替代品?冷可观察物通常来自Observable。create()是的,我相信我想要一个。数据输入流返回一个与传入请求相关的项(由doOnSubscribe的内容调用)。while(true)这只是一个简单的例子,让我们明白这应该一直运行。即使它是一个Observable.create,它也是一个与数据输入流的连接,因此很热。如果我真的可以观察到,使用它会关闭连接,这不是我想要的。你确定要使用
    Single
    ?听起来像是你e对多个事件感兴趣,
    Single
    发出一个事件(成功或错误),该事件是终端事件。而任何代码库中的(true)都会发出警报!您是否检查过RX主题是否是一个好的替代品?冷观测通常来自Observable。create()是的,我相信我想要一个。数据输入流返回一个与传入请求相关的项(由doOnSubscribe的内容调用)。而(true)作为一个简化的例子,它告诉我们这应该一直运行。尽管它是一个Observable.create,但它是一个到数据输入流的连接,因此很热。如果我使用Observable.using,它会关闭连接,这不是我想要的