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();
因此第一个问题: 如何仅在第一位观察者订阅时开始工作?(可连接的可观察可能?)
和重要的问题:当最后一个订阅者退订时如何停止工作?(我无法弄清楚如何访问当前订阅了该主题,想找到没有共享的全局状态干净的解决方案,如果这种方案存在)
一个解决方案,我能想到的是提升主体与运营商定制这将管理用户...