android - PublishSubject 为所有观察者调用昂贵的函数
问题描述
我有一个特定的场景,我实现了一个 PublishSubject 来根据自定义事件发出项目。对于将要发出的每个项目,我还需要保留该值(一项昂贵的操作)。我想要实现的是拥有一个函数(如map
),它将为所有观察者调用一次,然后每个观察者通过该onNext()
方法接收的项目。
题目:
static final PublishSubject<SomeResult> commonSubject = PublishSubject.create()
触发器(发射项目):
commonSubject.onNext(new SomeResult())
暴露主题(将由控制器使用):
public static Observable<SomeResult> observeResults() {
return commonSubject.share();
}
控制器:
public Observable<SomeResult> observeResults() {
return CustomConsumer.observeResults()
.observeOn(Schedulers.single());
}
订户:
CustomControllerResult.observeResults().subscribe(result -> doSomething());
CustomControllerResult.observeResults().subscribe(result -> doSomethingElse());
每个观察者都按预期接收项目,但是如果我将昂贵的操作添加到控制器,则会为每个观察者调用此操作(这是我不想要的):
public Observable<SomeResult> observeResults() {
return CustomConsumer.observeResults()
.observeOn(Schedulers.single())
.compose(persistResult())
.compose(logResult())
.share();
}
关于如何达到预期结果的任何想法?
解决方案
问题是每次observeResults()
调用它都会用share
操作符创建一个新的 Observable。但是创建的 Observable 并没有与订阅者共享。
您可以将代码更改为:
Observable<SomeResult> observable = CustomControllerResult.observeResults()
observable.subscribe(result -> doSomething());
observable.subscribe(result -> doSomethingElse());
或者您可以更改observeResults
方法以返回共享的 Observable:
static final PublishSubject<SomeResult> commonSubject = PublishSubject.create()
static final Observable<SomeResult> observable = commonSubject
.observeOn(Schedulers.single())
.compose(persistResult())
.compose(logResult())
.share();
public static Observable<SomeResult> observeResults() {
return observable;
}
推荐阅读
- nginx - Nuxtjs 和 Nginx 代理下载没有“http://”的文件
- keycloak - 在 Keycloak 中,当 user2 尝试使用 IDP 登录页面登录时,如何自动注销(使会话过期)user1?
- c++ - 调用类的成员函数后的垃圾值
- vimeo - 将公司品牌添加到 Vimeo 密码屏幕
- javascript - 我可以通过单击图像进行缩放,但我无法将自己定位在指针单击的位置
- sql - 用于获取用户、员工、公司的“计算”列 is_admin 的 SQL 查询
- python - 字符串索引必须是整数 - 它们是
- for-loop - 如何在数据框的名称()上运行循环以在 R 中创建新的数据框?
- python - 数组循环未在 Python 中返回预期输出
- javascript - Django Asyc Views 是 ajax 替代品吗?