当前位置: 首页 > 面试题库 >

RxJava的`Completable.andThen`没有串行执行?

卢景澄
2023-03-14
问题内容

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

以下样本详细解释了我的用例

说你有一堂课 User

        class User {
            String name;
        }

我有一个这样的Observable,

        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));
        }

首先,我正在做一些初始化工作Completable.fromAction,我希望andThen操作员仅在完成之后才能开始Completable.fromAction

这意味着我希望操作员开始mUser时会初始化andThen

以下是我对这个可观察的订阅

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

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

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

表示mUser为null, andThen在执行 Completable.fromAction。这里发生了什么事?

根据文件 andThen

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


问题答案:

问题不在里面,andThen而是在
Observable.just(mUser.name)里面andThen。该just运营商将立即尝试创建观察到,虽然它只会发出后Completable.fromAction

这里的问题是,尝试创建ObservableJust时,其mUser为null。

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

代替 andThen(Observable.just(mUser.name));

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

要么

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


 类似资料:
  • 首先,我在中进行一些初始化,我希望操作符只有在完成之后才启动。 这意味着当运算符启动时,将被initalized。 以下是我订阅的这个可观察到的 返回一个Observable,它将订阅这个Completable,一旦完成,它将订阅{@code next}ObservableSource。来自此Completable的错误事件将传播到下游订阅服务器,并将导致跳过Observable的订阅。

  • 我是RxJava的新手,正在尝试从link执行多个观测值的并行执行示例:RxJava并行获取观测值 虽然上面链接中提供的示例是并行执行可观察对象,但是当我在foreach方法中添加一个Thread.sleep(TIME_IN_MILLISECONDS)时,系统开始一次执行一个可观察对象。请帮助我理解为什么Thread.sleep停止可观察对象的并行执行。 下面是导致多个观测值同步执行的修改示例:

  • 嘿,我在POM中做了这个配置。xml文件并行运行测试。但当我使用cmd进行“mvn验证”时,只有一个浏览器正在运行一个功能,而在完成一个功能文件的执行后,另一个功能正在运行。这是我的代码和pom。xml请建议我怎么做? 我正在使用cucumber 这是我的pom.xml代码: 提前感谢。

  • 我制作了以下cronjob sh文件: 手动运行此文件时,作业将正确运行。

  • 问题内容: 我正在使用RxJava Observable api使用以下代码: 我的期望是观察代码,即subscribe()方法中的代码,在我指定了计算调度程序后将并行执行。相反,代码仍在单线程上按顺序执行。如何使用RxJava api使代码并行运行。 问题答案: RxJava在异步/多线程方面经常被误解。多线程操作的编码很简单,但是了解抽象是另一回事。 关于RxJava的一个常见问题是如何实现并

  • 问题内容: 我有2个AsyncTask,一个正在创建套接字连接,另一个正在使用那些套接字传输对象。我的代码是这样的: 但是,永远不会创建或执行被调用。我试图更改顺序,但未创建或执行发送器… 怎么了 问题答案: 当HONEY COMB将多个AsyncTask执行从并发更改为顺序执行时,我讨厌它。因此,每次执行AsyncTask时,我都会执行类似的操作。 但是线程池大小为5,如果添加第六个任务,它将被