我试图了解何时使用
Observable.just(1).subscribe(new Observer<Integer>() {
Disposable disposable;
@Override
public void onSubscribe(Disposable disposable) {
System.out.println("Subscribed");
this.disposable = disposable;
}
@Override
public void onNext(Integer integer) {
System.out.println(integer);
System.out.println(disposable.isDisposed());
}
@Override
public void onError(Throwable throwable) {
System.out.println("Error");
System.out.println(disposable.isDisposed());
}
@Override
public void onComplete() {
System.out.println("Complete");
System.out.println(disposable.isDisposed());
}
})
在OnComplete
或OnError
之后,disposable.isDisposed()
返回true,就像我使用时一样
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> observableEmitter) throws Exception {
if (!observableEmitter.isDisposed())
observableEmitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
Disposable disposable;
@Override
public void onSubscribe(Disposable disposable) {
System.out.println("Subscribed");
this.disposable = disposable;
}
@Override
public void onNext(Integer integer) {
System.out.println(integer);
System.out.println(disposable.isDisposed());
}
@Override
public void onError(Throwable throwable) {
System.out.println("Error");
System.out.println(disposable.isDisposed());
}
@Override
public void onComplete() {
System.out.println("Complete");
System.out.println(disposable.isDisposed());
}
});
我看到disposable.isDisposed()
返回false。有人可以解释一下我到底发生了什么吗?我理解写得好的Observable.create不能在onComplete()
或onError()
之后发出项目。
答案 0 :(得分:0)
Disposable
只保留对subscription
的引用,为了处置它,您需要调用disposable.dispose()
,Observable
不要在完整方法上配置Disposable
实例
@Override
public void onComplete() {
System.out.println("Complete");
disposable.dispose();
System.out.println(disposable.isDisposed());
}
答案 1 :(得分:0)
最初,isDisposed
意味着表示dispose
被调用。由于onError
和onComplete
默认情况下不会调用dispose
,因此终止后通常不会isDisposed
为真。 Reactive Streams规范指出,在调用onError
和onComplete
时,应认为订阅已取消,这意味着实现中不需要实际代码(因此开销)。
不幸的是,人们开始将其用作流程外的完成指示符(即,查看特定subscribe()
是否已达到其终端状态)。我不建议依赖isDisposed
(Disposable
个容器外),因为它会将异步响应与完成同步,并可能同步(并阻塞)等待完成。
在您的特定情况下,disposable
会在isDisposed
返回后显示onComplete
,因此外部视图会显示isDisposed
为真。