2016-01-20 2 views
1

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

Есть ли удобный способ сделать это? Удобный способ вместо этого создать поле для подписки и обработать его вручную?

Пример: Observable A испускает Boolean s. Если он испускает true, то подписка должна быть сделана до Observable B - если false, эта подписка должна быть отписана.

ответ

0

Я не уверен, что мы на 100% на одной странице, но, думаю, вам не хватает одной точки. Может быть, вы подумаете, что я задираю, но я думаю, что было бы неплохо получить наши условия.

Observable начинает излучать значения, когда Subscriberподписывается. Поэтому, если вы не думаете о двух отдельных Subscribers, вы не можете реагировать на испускаемое значение с подпиской , потому что Observer ничего не испустит.

Это говорит ... что (я думаю) вы хотите сделать можно сделать так:

Observable<Boolean> observableA = /* observable A initialization */; 
final Observable<SomeObject> observableB = /* observable B initialization */; 

observableA 
     .flatMap(new Func1<Boolean, Observable<SomeObject>>() { 
      @Override 
      public Observable<SomeObject> call(Boolean aBoolean) { 
       if (!aBoolean) { 
        throw new IllegalStateException("A dummy exception that is here just to cause the subscription to finish with error."); 
       } 
       return observableB; 
      } 
     }) 
     .subscribe(
       new Action1<SomeObject>() { 
        @Override 
        public void call(SomeObject someObject) { 
         // THIS IS A PART OF THE SUBSCRIBER TO OBSERVABLE B. 
         // THIS METHOD WILL BE CALLED ONLY IF THE OBSERVABLE A RETURNED TRUE 
        } 
       }, 
       new Action1<Throwable>() { 
        @Override 
        public void call(Throwable throwable) { 
         // A dummy Action1 so the subscription does not crash on the Exception 
        } 
       }); 
+0

Возможно, решение, о котором я думал, не существует. Да, я думал о двух подписях. Хотя я предпочитаю просто иметь поле для подписки и хранить подписку там/отказаться от подписки, вместо того, чтобы использовать неявную отмену подписки onError. –

0

Если все наблюдаемыми имеет тот же тип, или вы можете объединить все, что вы хотите на основе значений.

Observable.from(new int[]{1,2,3,4,5}) 
    .filter(i -> i < 5) // filter out something 
    .flatMap(i -> { 
     if (i < 2) { // subscribe on some observable, based on item value 
      return Observable.just(i); 
     } else { 
      return Observable.just(3); 
     } 
    })