【发布时间】:2018-02-05 14:32:17
【问题描述】:
我有一个用例,我在 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 运算符启动时被初始化。
以下是我对这个 observable 的订阅
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 为空,andThen 在执行Completable.fromAction 中的代码之前启动。这里发生了什么事?
根据andThen的文档
返回一个 Observable,它将订阅这个 Completable,一旦完成,就会订阅 {@code next} ObservableSource。来自此 Completable 的错误事件将传播到下游订阅者,并导致跳过 Observable 的订阅。
【问题讨论】: