如何在RX java链中使用“if-else”?

前端之家收集整理的这篇文章主要介绍了如何在RX java链中使用“if-else”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是RX Java / RX Android的新手.我想实现这个案例:根据RXJava中的某些条件选择不同的方式.
例如,首先,我从网络获取用户信息,如果这是一个VIP用户,我将继续从网络获取更多信息或只是在主线程中显示一些信息(打破链.)这里的流程图: https://i.stack.imgur.com/0hztR.png

我做了一些搜索,只发现“switchIfEmpty”可能有所帮助.
我写下面的代码

  1. getUserFromNetwork("userId")
  2. .flatMap(new Function<User,ObservableSource<User>>() {
  3. @Override
  4. public ObservableSource<User> apply(User user) throws Exception {
  5. if(!user.isVip){
  6. //show user info on MainThread!
  7. return Observable.empty();
  8. }else{
  9. return getVipUserFromNetwork("userId");
  10. }
  11. }
  12. }).switchIfEmpty(new ObservableSource<User>() {
  13. @Override
  14. public void subscribe(Observer<? super User> observer) {
  15. //show user info in main thread
  16. //just break the chain for normal user
  17. observer.onComplete();
  18. }
  19. }).doOnNext(new Consumer<User>() {
  20. @Override
  21. public void accept(User user) throws Exception {
  22. //show vip user info in main thread
  23. }
  24. }).subscribe();

有更简单的方法来实现这一目标吗?

谢谢!

解决方法

flatMap()是一个不错的选择,您可以使用它来拆分流,但最后流合并在一起(每个拆分可观察流的所有排放流到主流).
在你的代码中,switchIfEmpty()是多余的,因为它正是Observable.empty()所做的(立即调用onCompleted()),当然你需要观察者,如果你想在主线程上发生显示,但是无论如何,我认为在流中间处理这个问题并不是一个好习惯.

我认为,在您的情况下,您可以在单个处理程序中处理(响应)用户排放,因为它非常相似,只需检查是否为VIP,并相应地显示它.
所以看起来应该是这样的:

  1. getUserFromNetwork("userId")
  2. .flatMap(new Function<User,ObservableSource<User>>() {
  3. @Override
  4. public ObservableSource<User> apply(User user) throws Exception {
  5. if (!user.isVip) {
  6. return Observable.just(user);
  7. } else {
  8. return getVipUserFromNetwork("userId");
  9. }
  10. }
  11. })
  12. .observeOn(AndroidSchedulers.mainThread())
  13. .subscribe(user -> {
  14. if (user.isVip){
  15. //display vip user
  16. }else{
  17. //display regular user
  18. }
  19. });

在这种方法中,您有一个流流,在流的中间没有“副作用”.

如果您的处理完全不同(这不是这种情况),那么您可以将流拆分为2个独立的流并以不同的方式对每个流做出反应,这可以通过多播getUserFromNetwork()Observable和来自此Observable来完成.创建2个不同的Observable,一个将继续,例如getVipUserFromNetwork(),另一个不能,并且每个都可以有不同的订户逻辑. (你可以阅读here关于多播的答案)

猜你在找的Java相关文章