Rx java RxJava主题没有与.repeat()重复?

Rx java RxJava主题没有与.repeat()重复?,rx-java,Rx Java,有人能向我解释一下这种行为吗 我只是在学习RxJava,我想把我自己的事件发布到一个可观察的链上。但我在理解受试者的行为时遇到了一些问题 此代码: PublishSubject<String> subject = PublishSubject.create(); subject.repeat(3) .subscribe(s -> System.out.println("subject emitted %s", s)); subject.onNext("one")

有人能向我解释一下这种行为吗

我只是在学习RxJava,我想把我自己的事件发布到一个可观察的链上。但我在理解受试者的行为时遇到了一些问题

此代码:

PublishSubject<String> subject = PublishSubject.create();
subject.repeat(3)
       .subscribe(s -> System.out.println("subject emitted %s", s));

subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
subject.onNext("four");
subject.onCompleted();

Observable.just("one", "two", "three", "four")
          .repeat(3)
          .subscribe(s -> System.out.println("observer emitted %s", s));
为什么在这个问题上重复(3)被忽略了


谢谢

在第一次
订阅
之后,
重复
不会订阅
PublicSubject
,直到它收到一个
未完成的
。您可以使用
doOnSubscribe
doOnCompleted
对其进行调试。比如

    PublishSubject<String> subject = PublishSubject.create();
    subject.doOnSubscribe(() -> System.out.println("subject subscribe"))
            .doOnCompleted(() -> System.out.println("subject onCompleted"))
            .repeat(3)
            .subscribe(s -> System.out.printf("subject emitted %s\n", s));

    subject.onNext("one");
    subject.onNext("two");
    subject.onNext("three");
    subject.onNext("four");
    subject.onCompleted();

实际上,如果要将所有项目输出3次,可以使用
ReplaySubject

也许可以使用
.asObservable()
如下所示:

subject.asObservable().repeat(3)
       .subscribe(s -> System.out.println("subject emitted %s", s));

我懂了。所以我假设repeat()累积了值,然后在得到onComplete()时重新发出N次。但事实并非如此,它实际上什么也不做,直到它得到一个onComplete(),然后它订阅并期望它的可观察对象在订阅时重复所有项目。对于需要oncomplete的操作符来说,这是一种常见的模式吗?(也就是说,他们只是在完成之前没有op,然后订阅?)更准确地说,
repeat()
意味着重复订阅源代码<代码>重试具有类似的模式。如果出现任何
onError
错误,它只需再次订阅源代码。在主题案例中,Repeat不会被忽略,但它不会执行任何操作,因为它会重新订阅终止的主题。尽管此代码可以回答问题,提供关于为什么和/或如何回答该问题的额外背景将显著提高其长期价值。请您的答案添加一些解释。简单地说,.asObservable()将主题更改为observable.subject.asObservable()。重复(3)和subject.onnext(“一”)与observable.just(“一”)。重复(3)。您还可以使用android studio阅读源代码。这很好。
subscribe to PublicSubject
subject.onNext("one") => output "one"
subject.onNext("two") => output "two"
subject.onNext("three") => output "three"
subject.onNext("four") => output "four"
subject.onCompleted() => 
            output "onCompleted"
            subscribe to PublicSubject // a new Observer is added to PublicSubject and PublicSubject is still emitting `onCompleted`, 
                                       // so this new Observer will receive `onCompleted` at once
            output "onCompleted"
            subscribe to PublicSubject // a new Observer is added to PublicSubject and PublicSubject is still emitting `onCompleted`, 
                                       // so this new Observer will receive `onCompleted` at once
            output "onCompleted"
subject.asObservable().repeat(3)
       .subscribe(s -> System.out.println("subject emitted %s", s));