我有两个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()
,所以也许我在这里做错了事...
答案 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/