gpt4 book ai didi

java - onCompleted 在处理 RxJava concatMap 之前提前调用

转载 作者:行者123 更新时间:2023-12-02 11:46:16 25 4
gpt4 key购买 nike

我有两个可观察对象,并使用 concatDelayError 进行顺序处理。

我的问题是 onNext 和 onCompleted 在处理之前被提前调用。我如何知道所有处理都已完成并出现 concatDelayError?

伪代码:

public Observable<Integer> concat(){
int x = 10;
int y = 20;


Observable obx = Observable.create(emitter -> {
try {
int x = doSomeThing();
emitter.onNext(x);
emitter.onCompleted();
} catch (SQLiteException e) {
emitter.onError(e);
}
}, Emitter.BackpressureMode.BUFFER);
Observable oby = Observable.create(emitter -> {
try {
int y = doSomeThing();
emitter.onNext(y);
emitter.onCompleted();
} catch (SQLiteException e) {
emitter.onError(e);
}
}, Emitter.BackpressureMode.BUFFER);
Observable concated = Observable.concatDelayError(ob1,ob2)
.compose(applySchedulers())
.replay().autoConnect();

}

//somewhere else

concat().subscribe(mReplaySubject);


//somewhere else

mReplaySubject.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
launchActivity(SplashActivity.this, HomeActivity.class);
SplashActivity.this.finish();
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Integer value) {

}
});

我将reply()与autoConnect()结合使用,并通过ReplySubject进行订阅,因为我需要共享单个订阅。

最佳答案

您可以在 replay().autoConnect() 之前使用 doOnSubscribe,但您还需要一种方法来确保返回的 Observable 是最多设置一次:

final class OnceObservable {

final AtomicReference<Observable<Integer>> ref = new AtomicReference<>();

int x;
int y;

Observable<Integer> concat() {
Observable<Integer> obs = ref.get();
if (obs != null) {
return;
}

obs = Observable.concatDelayError(
Observable.fromCallable(() -> doSomething()),
Observable.fromCallable(() -> doSomethingElse())
)
.doOnSubscribe(() -> {
x = 10;
y = 20;
})
.replay().autoConnect();

if (!ref.compareAndSet(null, obs)) {
obs = ref.get();
}
return obs;
}
}

关于java - onCompleted 在处理 RxJava concatMap 之前提前调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48183669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com