RxJava的`Completable.andThen`没有串行执行? [英] RxJava `Completable.andThen` is not executing serially?

查看:85
本文介绍了RxJava的`Completable.andThen`没有串行执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用例,其中我在Completable中初始化一些全局变量,然后在链的下一步(使用 andThen 运算符)中使用这些变量.

以下示例详细说明了我的用例

假设您有一个类 User

 类User {字符串名称;} 

我有一个这样的Observable,

 私有用户mUser;//这是一个全局变量公共Observable< String>stringObservable(){返回Completable.fromAction(()-> {mUser = new User();mUser.name =名称";}).then(Observable.just(mUser.name));} 

首先,我要在 Completable.fromAction 中进行一些初始化,并且我希望 andThen 运算符仅在完成 Completable.fromAction 之后才能启动

这意味着我希望 andThen 运算符启动时会初始化 mUser .

以下是我对此观察性的订阅

  stringObservable().subscribe(s-> Log.d(TAG,"success:" + s),投掷->Log.e(TAG,"error:" + throwable.getMessage())); 

但是当我运行此代码时,出现错误

 尝试从空对象引用中的字段'java.lang.String User.name'中读取 

这意味着 mUser 为null,然后Then 在执行 Completable.fromAction 中的代码之前启动.这里发生了什么事?

根据 andThen

的文档

返回一个Observable,它将订阅此Completable,一旦完成,便将订阅{@code next} ObservableSource.此Completable中的错误事件将传播到下游订阅者,并导致跳过Observable的订阅.

解决方案

问题不在于 andThen ,而是内部的语句 Observable.just(mUser.name) andThen .尽管 just 运算符仅在 Completable.fromAction 之后才会发出,但它会尝试立即创建可观察对象.

这里的问题是,尝试使用just创建 Observable 时, mUser 为空.

解决方案:您需要推迟String Observable的创建,直到发生订阅为止,直到 andThen 的上游开始发出.

而不是 andThen(Observable.just(mUser.name));

使用

  andThen(Observable.defer(()-> Observable.just(mUser.name))); 

  andThen(Observable.fromCallable(()-> mUser.name)); 

I have a usecase where I initiallize some global variables in a Completable , and in the next step in the chain (using andThen operator) I make use of those variables.

Following sample explains my usecase in detail

Say you have a class User

        class User {
            String name;
        }

and I have an Observable like this ,

        private User mUser; // this is a global variable

        public Observable<String> stringObservable() {
            return Completable.fromAction(() -> {
                mUser = new User();
                mUser.name = "Name";
            }).andThen(Observable.just(mUser.name));
        }           

First I'm doing some initiallizations in my Completable.fromAction and I expect andThen operator to start only after completing the Completable.fromAction.

Which means I expect mUser to be initallized when the andThen operator starts.

Following is my subscription to this observable

             stringObservable()
            .subscribe(s -> Log.d(TAG, "success: " + s),
                    throwable -> Log.e(TAG, "error: " + throwable.getMessage()));

But when I run this code , I get an error

          Attempt to read from field 'java.lang.String User.name' on a null object reference

which means mUser is null , andThen started before executing the code in Completable.fromAction. Whats happening here?

According to documentation of andThen

Returns an Observable which will subscribe to this Completable and once that is completed then will subscribe to the {@code next} ObservableSource. An error event from this Completable will be propagated to the downstream subscriber and will result in skipping the subscription of the Observable.

解决方案

The issue is not with andThen but with the statement Observable.just(mUser.name) inside andThen . The just operator will try to create the observable immediately though it will emit only after Completable.fromAction.

Problem here is , while trying to create the Observable using just , the mUser is null.

Solution : You need to defer the creation of the String Observable till a subscription happens , till the upstream of andThen starts emission.

Instead of andThen(Observable.just(mUser.name));

use

 andThen(Observable.defer(() -> Observable.just(mUser.name)));

Or

 andThen(Observable.fromCallable(() -> mUser.name));

这篇关于RxJava的`Completable.andThen`没有串行执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆