gpt4 book ai didi

java - RxJava 在不重复执行的情况下组合可观察对象

转载 作者:行者123 更新时间:2023-11-30 08:31:28 26 4
gpt4 key购买 nike

短篇小说:我有一种情况,我有 2 个具有单一用途的 Observable:

  • 他们收到一些数据
  • 他们返回修改后的数据
  • 如果无法处理数据则抛出错误

他们各自负责处理不同类型的数据。此外,我想在处理完这两个数据后做一些事情。

我目前最好的实现如下,这些是我的 Observables:

    Single<BlueData> blueObservable = Single.create(singleSubscriber -> {
if (BlueDataProcessor.isDataValid(myBlueData)) {
singleSubscriber.onSuccess(BlueDataProcessor.process(myBlueData));
}
else {
singleSubscriber.onError(new BlueDataIsInvalidThrow());
}
});

Single<RedData> redObservable = Single.create(singleSubscriber -> {
if (RedDataProcessor.isDataValid(myRedData)) {
singleSubscriber.onSuccess(RedDataProcessor.process(myRedData));
}
else {
singleSubscriber.onError(new RedDataIsInvalidThrowable());
}
});

Single<PurpleData> composedSingle = Single.zip(blueObservable, redObservable,
(blueData, redData) -> PurpleGenerator.combine(blueData, redData));

我还有以下订阅:

    blueObservable.subscribe(
result -> {
saveBlueProcessStats(result);
},
throwable -> {
logError(throwable);
});

redObservable.subscribe(
result -> {
saveRedProcessStats(result);
},
throwable -> {
logError(throwable);
});


composedSingle.subscribe(
combinedResult -> {
savePurpleProcessStats(combinedResult)
},
throwable -> {
logError(throwable);
});

我的问题:蓝色和红色数据被处理了两次,因为两个订阅都再次运行,我订阅了使用 Observable.zip() 创建的组合可观察对象。

如何在不运行这两个操作两次的情况下实现这种行为?

最佳答案

这对于 1.x 中的 Single 是不可能的,因为没有 ConnectableSingle 的概念,因此没有 Single.publish 的概念。您可以通过 2.x 和 RxJava2Extensions 库实现效果:

SingleSubject<RedType> red = SingleSubject.create();
SingleSubject<BlueType> blue = SingleSubject.create();

// subscribe interested parties
red.subscribe(...);
blue.subscribe(...);

Single.zip(red, blue, (r, b) -> ...).subscribe(...);

// connect()
blueObservable.subscribe(blue);
redObservable.subscribe(red);

关于java - RxJava 在不重复执行的情况下组合可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638488/

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