RxJava 2 - 如何链接异步调用

时间:2017-09-26 12:53:39

标签: java-8 rx-java observable rx-android

我刚刚开始学习RxJava,所以如果我问一个新手问题,不要把我钉在十字架上,但我现在花了几天时间试图弄明白这一点而没有任何成功。我已经阅读了几乎所有可以找到的文档,并且我遵循了http://reactivex.io/tutorials.html上的大部分教程。我搜索了StackOverflow和其他互联网的高低,但显然我似乎是这个星球上唯一有这个问题的人。这很奇怪,因为它本质上归结为每个软件必须做的事情:登录用户。

我找到的所有教程都是在一个流上应用一些函数来创建一个有用且令人敬畏的新流,不会让我弄错,但在我的情况下并没有真正帮助。它也让我思考......也许我认为这一切都错了。但是我现在陷入了如此沉重的境地,并且遵循了这样的口号:"一切都是一条流"为什么那不可能?

所以这就是我想要做的事情:

  1. 表示某种形式的装载
  2. 调用Completable在某些服务器上执行登录操作
  3. 调用Single在某个服务器上执行创建用户操作,该服务器返回用户ID以供本地参考
  4. 在下一个操作中使用Single调用的结果并隐藏加载
  5. 即使我最终会在Android上使用它,我创建了一个基本的Java 8示例来概述我想要实现的目标。

    这是我到目前为止所提出的:

    注意:

    • 我使用的是rxjava2
    • getMainStream()函数用于模拟某些交互

    这是代码的可运行版本:

    public static void main(final String[] args) {
        getMainStream()
            .doOnNext(__ -> showLoading())
            .flatMap(__ -> loginUser().toObservable())
            .flatMap(__ -> createUser().toObservable())
            .doOnNext(userId -> {
                hideLoading();
                System.out.println("userId: " + userId);
            })
            .subscribe();
    }
    
    public static Completable loginUser() {
        return Completable.create(new CompletableOnSubscribe() {
            @Override
            public void subscribe(final CompletableEmitter e) throws Exception {
                Thread.sleep(500);
                System.out.println("loginUser");
                e.onComplete();
            }
        });
    }
    
    public static Single<String> createUser() {
        return Single.<String>create(new SingleOnSubscribe<String>() {
            @Override
            public void subscribe(final SingleEmitter<String> e) throws Exception {
                Thread.sleep(1000);
                System.out.println("createUser");
                e.onSuccess("some_user_id");
            }
        });
    }
    
    public static Completable getCompletable(final String input) {
        return Completable.create(new CompletableOnSubscribe() {
            @Override
            public void subscribe(final CompletableEmitter e) throws Exception {
                Thread.sleep(750);
                System.out.println("completable, input=" + input);
                e.onComplete();
            }
        });
    }
    
    public static Observable<Object> getMainStream() {
        return Observable.just(new Object());
    }
    
    private static void hideLoading() {
        System.out.println("hideLoading()");
    }
    
    private static void showLoading() {
        System.out.println("showLoading()");
    }
    

    控制台的输出是:

    showLoading()
    loginUser
    

    不幸的是,登录用户永远不会返回?!

    我真的很期待这个主题的任何帮助!

    感谢!!!

1 个答案:

答案 0 :(得分:0)

loginUser()Completable,当您将Completable转换为Observable时,效果是观察结果将完成。因此,createUser()没有下游值可以采取行动。

您可以考虑将表达式更改为loginUser().andThen( () -> createUser().toObservable(),这会导致发出字符串。