根据其他排放量进行订阅

时间:2016-01-20 11:22:41

标签: java rx-java

我有一个可以发出值的观察者。基于这些值,我需要订阅/取消订阅另一个Observable。

有没有方便的方法呢?一种方便的方法,而不是为订阅创建一个字段并手动处理它?<​​/ p>

实施例: Observable A发出Boolean个。如果它发出true,则应订阅Observable B - 如果false此订阅应取消订阅。

2 个答案:

答案 0 :(得分: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
                    }
                });

答案 1 :(得分: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);
        }
    })