2016-03-24 43 views
2

假設你有一些長期運行的任務由觀察到的包裹:如何在不使用Observable.create()時檢查訂閱狀態?

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

有沒有什麼辦法來檢查是否可觀察已取消訂閱,以確定我們是否應該取消工作,並擺脫困境?

更具體地說,是否可以在使用Observable.defer()Observable.fromCallable()時檢查訂閱的狀態(例如isUnsubscribed())?

我知道您在使用Observable.create()時可以檢查subscriber.isUnsubscribed(),但是,由於建議不要使用Observable.create(),對於其他操作員該如何處理?

回答

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