在RxJava流执行时修改它

时间:2016-06-30 00:28:10

标签: rx-java

我有一个应用程序,用户可以根据他们订阅的主题接收通知。工作流程如下:

  1. 用户登录
  2. 该应用注册到通知服务器
  3. 用户选择订阅/取消订阅各种主题
  4. 我希望序列化所有网络请求。如果我在初始化时知道​​将要订阅/取消订阅哪些确切的主题,我可以编写如下的流:

        loginObservable.subscribeOn(Schedulers.io())
                .flatMap(user -> registerApp(appId))
                .flatMap(o -> subscribeToTopic("topic1"))
                .flatMap(o -> unsubscribeFromTopic("topic2"))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe()
    

    事情是,用户可以在应用程序生命周期的任何时候订阅/取消订阅,甚至可以在注册成功之前进行订阅/取消订阅。我可以在onComplete()中手动维护一个可观察和序列化所有请求的列表,但这听起来不是Rx-ish。我有机会以更简洁的方式做到这一点吗?类似的东西:

        observable = loginObservable.subscribeOn(Schedulers.io())
                .flatMap(user -> registerApp(appId))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe()
    
        //later
        observable.flatMap(o -> subscribeToTopic("topic1"))
                .subscribe()
    
        //even later
        observable.flatMap(o -> unsubscribeFromTopic("topic2"))
                .subscribe()
    

2 个答案:

答案 0 :(得分:0)

使用doOnSubscribe怎么样?您可以在主题发布之前注册您的应用程序。

看看这个例子。

boolean onSubscribe = false;

@Test
public void observableDoOnSubscribe() {
    String val = "test";
    Observable.just(val)
              .doOnSubscribe(() -> onSubscribe = true)
              .filter(s -> onSubscribe)
              .subscribe(s -> System.out.printf(s));
}

您可以在此处查看更多示例https://github.com/politrons/reactive

答案 1 :(得分:0)

您可以通过PublishSubject将新主题引入可观察对象。我在您的示例中并未理解您对switchMap的使用,但这种方法可能对您有用:

PublishSubject<Topic> newTopics = PublishSubject.create();
Observable<Topic> topics = ...;
newTopics
    .mergeWith(topics)
    .flatMap(topic -> subscribeToTopic(topic))
    ...
    .subscribe(subscriber);

UI互动:

newTopics.onNext(topic);