2017-11-09 36 views
0

私はクラスをRxJava2で使用しています。なぜ "Maybe.doOnDispose"はRxJava2ではサポートされていませんか?

私はdoOnDisposeコールバックを登録してDisposeイベントを検出しましたが、起動されません。

Maybe.just("aaa") 
    .doOnDispose({ /* do something */ }) 
    .subscribe(...) 

私はRxJava 2のコードを見て、しかしMaybedoOnDisposeをサポートしていないようでした。

Maybe

,,, doOnDispose

@CheckReturnValue 
@SchedulerSupport("none") 
public final Maybe<T> doOnDispose(Action onDispose) { 
    return RxJavaPlugins.onAssembly(new MaybePeek(this, Functions.emptyConsumer(), Functions.emptyConsumer(), Functions.emptyConsumer(), Functions.EMPTY_ACTION, Functions.EMPTY_ACTION, (Action)ObjectHelper.requireNonNull(onDispose, "onDispose is null"))); 
} 

protected void subscribeActual(MaybeObserver<? super T> observer) { 
    this.source.subscribe(new MaybePeek.MaybePeekObserver(observer, this)); 
} 
MaybePeek(ない DoOnDisposeObserver)オブジェクトを作成します。しかし、 SingleDoOnDisposeObserverを作成し、それがうまく働いているです。

@CheckReturnValue 
@SchedulerSupport("none") 
public final Single<T> doOnDispose(Action onDispose) { 
    ObjectHelper.requireNonNull(onDispose, "onDispose is null"); 
    return RxJavaPlugins.onAssembly(new SingleDoOnDispose(this, onDispose)); 
} 

protected void subscribeActual(SingleObserver<? super T> s) { 
    this.source.subscribe(new SingleDoOnDispose.DoOnDisposeObserver(s, this.onDispose)); 
} 

なぜMaybe.doOnDisposeはサポートされていませんか?

答えて

1

ドキュメントを約doOnDispose(Action onDispose)

言うように、下流のシーケンスを配置した場合にdisposeアクションを呼び出します。

あなたの川下は決してそれを処分しないので決して呼ぶことはありません。

Disposable disposable = Maybe.just("aaa") 
    .doOnDispose({ /* do something */ }) 
    .subscribe(...) 

disposable.dispose(); 

doOnDisposeのアクションを呼び出す必要があります。

ストリームの完了に次の操作(disposable.dispose())に行くより時間がかからない場合は、onDisposeアクションを呼び出すべきではないことに注意してください。したがって、それを確認するために、あなたは遅延を使用することができます:

Disposable disposable = Maybe.just("aaa") 
    .delay(2000, TimeUnit.MILLISECONDS) 
    .doOnDispose({ /* do something */ }) 
    .subscribe(...) 

disposable.dispose(); 

これでアクションが発生します。

+0

素晴らしいです!ありがとう – yuki312

関連する問題