2015-12-25 149 views
3

按需执行给定一个寒冷的例子:在热可观察

Observable<Integer> cold = Observable.create(subscriber -> { 
    try { 
    for (int i = 0; i <= 42; i++) { 

     // avoid doing unnecessary work 
     if (!subscriber.isUnsubscribed()) { 
     break; 
     } 

     subscriber.onNext(i); 
    } 
    subscriber.onCompleted(); 
    } catch (Throwable cause) { 
    subscriber.onError(cause); 
    } 
}); 

它开始从头开始执行的每个新用户:

// starts execution 
cold.subscribe(...) 

,如果用户退订早期可以停止执行:

// stops execution 
subscription.unsubscribe(); 

现在如果不是样本for循环,我们有一些实际的业务逻辑正在进行(这样做n OT需要重播每个用户,但代替实时的),那么我们面对的是热可观察......

PublishSubject<Integer> hot = PublishSubject.create(); 

Thread thread = new Thread(() -> { 
    try { 
    for (int i = 0; i < 42; i++) { 
     // how to avoid unnecessary work when no one is subscribed? 
     hot.onNext(i); 
    } 
    hot.onCompleted(); 
    } catch (Throwable cause) { 
    hot.onError(cause); 
    } 
}); 

时,我们希望它开始时,我们可能会做

// stats work (although no one is subscribed) 
thread.start(); 

因此第一个问题: 如何仅在第一位观察者订阅时开始工作?(可连接的可观察可能?)

和重要的问题:当最后一个订阅者退订时如何停止工作?(我无法弄清楚如何访问当前订阅了该主题,想找到没有共享的全局状态干净的解决方案,如果这种方案存在)

一个解决方案,我能想到的是提升主体与运营商定制这将管理用户...

回答