【问题标题】:subscribing to an observable when another observable completes当另一个可观察对象完成时订阅一个可观察对象
【发布时间】:2016-08-31 13:43:02
【问题描述】:

保持简单明了,如何在另一个订阅者的 onNext() 方法中订阅一个 observable,以便我们只能在当前 observable 完成执行时进行嵌套订阅。两个订阅都将在不同的线程上进行,并且要求第一个线程必须在第二个线程启动之前完成其执行。

makeObservable()
.subscribeOn(Schedulers.newThread())
.subscribe(new Subscriber<User> {
    @override
    void onNext(User user){
    //do something
    //make another subscription here
});

【问题讨论】:

    标签: android multithreading rx-java rx-android


    【解决方案1】:

    不要进行新订阅,返回另一个Observable 并订阅它。

    apiCall()
    .subscribeOn(<scheduler>)
    .observeOn(<scheduler>)
    .flatMap(new Func1<User, Observable<Something>() {
        @Override
        public Observable<Something> call(User user) {
            return Observable.just(<example>);
        }
    });
    

    编辑:当 api 调用返回时,flatMap 将拦截流,并从那里返回一个 Observable 或调用一个返回 Observable 的函数(即另一个 api 调用)。

    【讨论】:

    • 稍加阐述会有所帮助
    【解决方案2】:

    如果它们都发出相同的项目,请使用Observable.concat(),它在可观察的 N 完成后订阅可观察的 N+1。但更详细地描述您的用例可能是值得的。

    编辑:您应该能够执行以下操作:

    userClient
    .saveUser(user)
    .flatMap(userSaveResult -> 
        userClient
       .saveUserDetails(userSaveResult.id, seuser.getDetails))
    .onError(...)
    

    【讨论】:

    • 我正在使用改造来返回一个作为调用 API 的结果的 observable,以及另一个来自另一个调用的 observable。第一次调用将一些项目添加到数据库中,第二次调用在数据库中进行一些更新。这两个调用都会发出不同的项目(比如第一个 observable 发出 User,第二个发出与 User 相关的项目,例如 UserInfo)。显然,只有当 User 存在于由第一个 observable 发出的数据库中时,才能进行更新。
    • 我对 lambdas 还不熟悉,如果你用简单的语法写出来让我理解,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多