2015-11-02 151 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);