有人能理解java.lang.IllegalStateException:在这个简短的示例中只允许一个观察者吗?

有人能理解java.lang.IllegalStateException:在这个简短的示例中只允许一个观察者吗?,java,reactive-programming,rx-java2,Java,Reactive Programming,Rx Java2,我知道30491785讨论了这一点,但并没有真正解释为什么会产生错误,并且示例涉及无关代码。我想用一个5行的例子来问这个问题 问题是gwindows上发生了什么,而swindows上没有发生什么(除了类型不同这一事实),有什么解决办法吗 public class OneObservableError { public static void main(String[] args) throws Exception { Observable<Long> sou

我知道30491785讨论了这一点,但并没有真正解释为什么会产生错误,并且示例涉及无关代码。我想用一个5行的例子来问这个问题

问题是gwindows上发生了什么,而swindows上没有发生什么(除了类型不同这一事实),有什么解决办法吗

public class OneObservableError {

    public static void main(String[] args) throws Exception {
        Observable<Long> source = Observable.interval(1, TimeUnit.SECONDS);
        Observable<Observable<Long>> swindows = source.window(source, s -> Observable.interval(3, TimeUnit.SECONDS));
        Observable<GroupedObservable<Long, Long>> groups = source.groupBy(x -> x % 4);
        Observable<Observable<Observable<Long>>> gwindows
                = groups.map(g -> g.window(g, i -> Observable.interval(3, TimeUnit.SECONDS)));
        //swindows.flatMap(gw->gw).subscribe(System.out::println); //Works
        gwindows.flatMap(gw -> gw).subscribe(System.out::println); //Fails with Only one Observable allowed     
        sleep(10000);
    }
公共类OneObservableError{
公共静态void main(字符串[]args)引发异常{
可观测源=可观测间隔(1,时间单位秒);
Observable swindows=source.window(source,s->obbservable.interval(3,TimeUnit.SECONDS));
可观察组=source.groupBy(x->x%4);
可观测gwindows
=groups.map(g->g.window(g,i->Observable.interval(3,TimeUnit.SECONDS));
//swindows.flatMap(gw->gw).subscribe(System.out::println);//有效
gwindows.flatMap(gw->gw).subscribe(System.out::println);//失败,只允许一个可观察对象
睡眠(10000);
}

GroupedObservable是一种单播类型的源,您不能多次使用它。问题在于您在g.window(g,…)的代码,其中window操作符尝试订阅两次。使用publish(函数)共享一次性g:

g.publish(gs -> gs.window(gs, ...).flatMap(gw -> gw))...

是的,这很有效。(我使用g.share()而不是g.publish,因为我不知道如何连接这些组。如果知道如何连接,我将不胜感激。)还有一个问题。组有什么特别之处?例如,如果我没有使用groupBy,而是使用filter对流进行分区,然后对过滤后的流进行操作,那么我没有遇到错误。为什么过滤后的流没有遇到相同的问题?
groupBy
创建子流,而
filter
没有。