在doOnNext()中未为Consumer.accept()调用Subject

时间:2019-09-23 09:27:57

标签: java rx-java2

我有两个Subject,一个订阅另一个更新。

Subject<Integer> subject = new Subject<>() {
    @Override
    public boolean hasObservers() {
        return false;
    }

    @Override
    public boolean hasThrowable() {
        return false;
    }

    @Override
    public boolean hasComplete() {
        return false;
    }

    @Override
    public Throwable getThrowable() {
        return null;
    }

    @Override
    protected void subscribeActual(Observer<? super InitialAPIResponse> observer) {

    }

    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(Integer result) {
        Log.d(TAG, "onNext: " + apiResponse);
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
};

subject.doOnNext(result -> Log.d("Subject", "accept: " + result));

observableSubject
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(subject);

observableSubject.onNext(1);
observableSubject.onComplete();

调用onNext()时,Consumer中提供的accept()的{​​{1}}不是。即使根据文档

  

Observable.doOnNext()

     

修改源doOnNext(),以便它在调用ObservableSource时调用一个动作。

     

计划程序:    onNext默认不会在特定的doOnNext

上运行      

Scheduler              源ObservableSource调用onNext

时要调用的操作      

返回应用了副作用行为的源ObservableSource

根据我对文档的了解,可观察对象应该在onNext中调用Consumer

我正在学习 doOnNext() ,所以也许我在这里做错了事...

1 个答案:

答案 0 :(得分:0)

有两个问题:

1。

subject.doOnNext(result -> Log.d("Subject", "accept: " + result));

在上面的代码中,doOnNext的结果未订阅。 doOnNext不能像许多其他运营商一样自行订阅上游。更改为此,例如:

subject.doOnNext(result -> Log.d("Subject", "accept: " + result)).subscribe();

2。

observableSubject
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(subject);

observableSubject.onNext(1);
observableSubject.onComplete();

在上面的代码中,onComplete之后立即调用.onNext。发出值时,这可能会导致时序问题。

将以上代码更改为任一

observableSubject
            .subscribe(subject); // subscribe on the same thread so that everything happens sequentially. 

observableSubject.onNext(1);
observableSubject.onComplete();

Subject<Integer> observableSubject = BehaviorSubject.create();
observableSubject
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(subject);

observableSubject.onNext(1);
// observableSubject.onComplete(); // don't call onComplete/