[英]Observable.Create and Observer Disposal
我想了解我何時使用
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
之后, OnComplete
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()
之后發出項目。
Disposable
僅持有對subscription
的引用,為了對其進行處置,您需要調用disposable.dispose()
, Observable
不會在complete方法上處置Disposable
實例。
@Override
public void onComplete() {
System.out.println("Complete");
disposable.dispose();
System.out.println(disposable.isDisposed());
}
最初, isDisposed
旨在指示調用了dispose
。 由於onError
和onComplete
默認情況下不調用dispose
,因此終止后通常不會使isDisposed
true。 Reactive Streams規范指出,在調用onError
和onComplete
時,應將訂閱視為已取消,這意味着實現中不需要任何實際代碼(因此開銷)。
不幸的是,人們開始在流程外部將其用作完成指標(即,查看特定的subscribe()
是否已達到其最終狀態)。 我不建議依賴isDisposed
(在Disposable
容器之外),因為它通過可能等待同步的同步(和阻塞)使異步完成反應isDisposed
。
在您的特定情況下, disposable
將在onComplete
返回后指示isDisposed
,因此外部視圖將指示isDisposed
true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.