我有一个应用程序,用户可以根据他们订阅的主题接收通知。工作流程如下:
我希望序列化所有网络请求。如果我在初始化时知道将要订阅/取消订阅哪些确切的主题,我可以编写如下的流:
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()
答案 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);