当前位置: 首页 > 知识库问答 >
问题:

RxJava`Completable.andthen`不是串行执行吗?

法景明
2023-03-14
        class User {
            String name;
        }
        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之后才启动。

这意味着当andthen运算符启动时,muser将被initalized。

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

             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

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

共有1个答案

陈铭晨
2023-03-14

问题不在于andthen,而在于andthen内部的语句observable.just(muser.name)just运算符将尝试立即创建observable,尽管它只会在Completable.FromAction之后发出。

这里的问题是,当试图使用just创建可观察的时,muser是空的。

解决方案:您需要推迟字符串Observable的创建,直到订阅发生,直到的上游,然后开始发射。

 andThen(Observable.defer(() -> Observable.just(mUser.name)));
 andThen(Observable.fromCallable(() -> mUser.name));
 类似资料:
  • 问题内容: 我有一个用例,其中在Completable中初始化一些全局变量,然后在链的下一步(使用运算符)中使用这些变量。 以下样本详细解释了我的用例 说你有一堂课 我有一个这样的Observable, 首先,我正在做一些初始化工作,我希望操作员仅在完成之后才能开始。 这意味着我希望操作员开始时会初始化。 以下是我对这个可观察的订阅 但是当我运行此代码时,出现错误 表示为null, 在执行 。这里

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

  • 我需要在我的服务器上运行函数 但是由于安全原因被禁用,但是PHP执行函数正在运行和。 是否可以使用php函数执行相同的操作? 禁用功能 链接,符号链接,执行,通过,proc_close,proc_get_status,proc_open,shell_exec,系统,流行,关闭

  • 问题内容: 我已经为Web API实现了多个软件包,每个软件包都有自己的测试用例。使用测试通过每个包装时通过。如果我想一次用测试案例运行所有测试,则总是失败。 在每个测试案例中,我使用来重新创建整个架构,并应用所有迁移。测试套件随机报告错误,说不存在关系/表,所以我猜每个测试套件(每个程序包)都以某种方式并行运行,从而弄乱了数据库状态。 我试图通过一些测试标志,例如没有成功。 这里的问题可能是并行

  • 我有一些传入的并发请求应该以串行方式处理。我试图通过将请求转换为消息并发布到jms队列来实现这一点。然后使用 mdb 处理队列。 使用特定于供应商的配置,我知道我可以将mdb限制为一个实例,但是有什么推荐的可移植的方法来解决这个问题呢? 编辑:忘了提一下我真的不需要jms的特性(可靠性等)。

  • 有没有一种方法可以让发出数据,并且当它发出数据时(或者当它完成时)以异步方式使用该数据触发? 我的问题与此非常相似,但我试图异步调用Completable。 这是我试图实现的一个微不足道的例子: 我看到订阅映射中的Completable允许我以某种方式完成这项任务,但我不知道如何以正确的方式处理它(因为在活动中不调用此方法)。 非常感谢您的帮助,谢谢!