2016-03-24 8 views
2

は、あなたが観測可能で包まれたいくつかの長い実行中のタスクがあるとしましょう:Observable.create()を使用しない場合のサブスクリプションステータスを確認する方法は?

Observable.fromCallable(new Callable<String>() { 
    @Override 
    public String call() throws Exception { 
     return longRunningTask(); 
    } 
} 

は、観察は、我々は仕事をキャンセルして、救済すべきかどうかを判断するために退会されたかどうかを確認する方法はありますか?

具体的には、Observable.defer()またはObservable.fromCallable()を使用している場合、サブスクリプションのステータス(例:isUnsubscribed())を確認できますか?

私はあなたがObservable.create()を使用した場合、しかし、それはObservable.create()を使用する無分別なので、どのようにこれは他の演算子で行うことができますか?subscriber.isUnsubscribed()を確認することができますことを承知していますか

答えて

1

Observable.doOnSubscribe(Action0)Observable.doOnUnsubscribe(Action0)の場合はどうですか?サブスクリプションはカウントできます。サブスクリプションがない場合は、ジョブを停止できます。

挨拶、 マーティン

0

fromCallableは、消費者に公開しません。このためには、次のような体でcreateが必要になります。

final SingleDelayedProducer<T> singleDelayedProducer = 
    new SingleDelayedProducer<T>(subscriber); 

subscriber.setProducer(singleDelayedProducer); 

try { 
    T result; 

    // computation 

    if (subscriber.isUnsubscribed()) { 
     return; 
    } 

    // more computation 

    result = ... 

    singleDelayedProducer.setValue(result); 
} catch (Throwable t) { 
    Exceptions.throwOrReport(t, subscriber); 
} 
+0

ですから、 'fromCallable'または' defer'を使用した場合、サブスクリプションの状態を確認する方法はありません言っていますか? – ashughes

+0

彼らはそのことを念頭に置いて設計されておらず、そのような要求はほとんど起こりません。 – akarnokd

関連する問題