rxJava перестает наблюдать при отписке

У меня есть холодное наблюдаемое, которое производит много элементов при подписке на планировщик вычислений и отправляет другому, кто выполняет более тяжелую работу над ними.

Проблема в том, что я хочу остановить всю наблюдаемую цепочку, когда отписываюсь от нее.

Есть какой-нибудь оператор для этого? Я попытался проверить, есть ли у меня подписчик, но на данный момент большинство моих предметов было отправлено.


person Guilherme Torres Castro    schedule 21.07.2016    source источник
comment
вызов subscriber.unsubscribe() отменит подписку на всю цепочку. У вас одна цепочка? Вы можете показать код?   -  person Dave Moten    schedule 22.07.2016
comment
@DaveMoten, Да, моя первая наблюдаемая перестанет испускать элементы, но моя (медленная) flatmap функция продолжает работать с элементами, сгенерированными до вызова en unsubscribe.   -  person Guilherme Torres Castro    schedule 22.07.2016
comment
@GuilhermeTorresCastro ваши потоки будут прерваны при отказе от подписки - проверяйте статус прерывания, пока вы выполняете работу, и преждевременно выходите, когда он установлен.   -  person Tassos Bassoukos    schedule 23.07.2016
comment
@TassosBassoukos Я тестировал, и статус прерывания не изменился.   -  person Guilherme Torres Castro    schedule 24.07.2016


Ответы (1)


Создайте наблюдаемый объект, который выполняет тяжелую работу и может проверять подписку:

obs //emits stuff fast
  .flatMap(x -> 
    Observable.create(
        sub -> {
          //frequently check subscription status
          while (!sub.isUnsubscribed()) {
            // do some work
            if (finished) break;
          }
          if (!sub.isUnsubscribed()) {
            sub.onNext(result);
            sub.onCompleted();
          }
        }))
      //ensure backpressure compliant
      .onBackpressureBuffer() 
    ).subscribe(subscriber);  
person Dave Moten    schedule 23.07.2016
comment
Я чувствую себя глупо из-за того, что не думаю об этом. Спасибо! - person Guilherme Torres Castro; 24.07.2016