2015-11-02 231 views
4

在代碼中,我需要釋放一些取消訂閱上的資源(它在哪裏記錄「發佈」)。RxJava:不會調用訂閱的取消訂閱()方法

Observable first = Observable.create(new Observable.OnSubscribe<Object>() { 
        @Override 
        public void call(Subscriber<? super Object> subscriber) { 
         subscriber.add(Subscriptions.create(() -> { 
          log(「release」);   
         })); 
        } 
       }).doOnUnsubscribe(() -> log(「first」)); 
    Observable second = Observable.create(…).doOnUnsubscribe(() -> log(「second」)); 
    Observable result = first.mergeWith(second).doOnUnsubscribe(() -> log(「result」)); 
    Subscription subscription = result.subscribe(…); 
    //… 
    subscription.unsubscribe(); 

但它只記錄「結果」。看起來退訂不會傳播給合併的孩子觀察對象。那麼如何處理第一個observable的Observable.OnSubscribe內部的取消訂閱?

回答

5

大多數情況下,調用unsubscribe隻影響實時序列,並且如果某些序列已完成,則可能無法傳播:運算符可能無法將其源保存在周圍,以避免內存泄漏。主要想法是運營商在他們調用下游的onErroronCompleted方法之前或之後釋放他們管理的任何資源,但這與1.x有些不一致。

如果你想確保資源釋放,看using運營商將在終止或取消訂閱釋放你的資源:

Observable.using(
    () -> "resource", 
    r -> Observable.just(r), 
    r -> System.out.println("Releasing " + r)) 
.subscribe(System.out::println);