java - 在 doOnNext() 中没有为 Subject 调用 Consumer.accept()
问题描述
我有两个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()
doOnNext()
Observable.doOnNext()
修改源
ObservableSource
,以便在调用 时调用操作onNext
。调度程序:
doOnNext
默认情况下不运行在特定的Scheduler
onNext
当源 ObservableSource 调用时调用的动作onNext
返回应用了副作用行为的源 ObservableSource
根据我从文档中了解到的情况,observable 应该调用Consumer
in doOnNext()
。
我正在学习RxJava
,所以也许我在这里做错了什么......
解决方案
有两个问题:
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/
推荐阅读
- task - Yocto - 为什么我不能覆盖构建任务?
- pandoc - Pandoc 是否可以将文本作为输入参数而不是输入文件?
- python - 一个元组的熊猫数据框索引?
- css - 如何使用均匀分隔的链接和父容器制作动态导航栏 (React/CSS)
- kotlin - kotlin 接口成员的默认可见性
- javascript - 将画布对象拖放到可缩放的 SVG 图像地图上
- python - Coinbase-API cbpro Websocket 订单提交问题
- css - 当侧边栏未折叠时,如何使浏览器窗口的 div 宽度为 100%?
- r - 如何从 zip 文件中的文件名中删除特殊字符?
- python - 您将如何编写脚本以从字符串列表中取出信息,并将其重新插入到另一个字符串列表中?