Rx java 我怎样才能拥有一个不会改变流的副作用订阅?
情景: 我有一个数据列表(企业事务)。如果满足以下两个条件,则认为该数据已过时:Rx java 我怎样才能拥有一个不会改变流的副作用订阅?,rx-java,Rx Java,情景: 我有一个数据列表(企业事务)。如果满足以下两个条件,则认为该数据已过时: 用户(UI/视图)订阅了数据源(一个rx.Observable) >=自上次网络同步以来已过去5分钟。此值被序列化并从数据库中观察 注意:如果UI/视图未订阅数据源,并且>=5五分钟过去了,我不想同步新数据(因为没有人在侦听) 下面是代码示例的一些详细信息: data.observed()返回rx.observeable void syncIfLast5Minutes()将强制检查过去五分钟内是否有同步,如果
- 用户(UI/视图)订阅了数据源(一个
)rx.Observable
- >=自上次网络同步以来已过去5分钟。此值被序列化并从数据库中观察
返回data.observed()
rx.observeable
将强制检查过去五分钟内是否有同步,如果没有,则将执行新的网络请求以获取新数据void syncIfLast5Minutes()
data.observe()
.doOnSubscribe(transactions -> syncIfLast5Minutes()
但这只会检查UI在初始订阅时数据是否过时。如果用户界面在5分钟后仍被订阅,则此处不会触发自动刷新(但我希望它这样做)
我正在寻找一个副作用的经营者,将
- 不影响原始流
- 订阅启动计时器,该计时器将在数据过时时进行监控(>=5分钟过去)
- 取消订阅将取消此计时器
RxJava中是否有一种惯用的方法来实现这一点?您可以通过将流与执行副作用(数据刷新)的
可观察的.interval
合并来实现所需的功能,并对其应用ignoreElements
这是一个工作示例:
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.subjects.PublishSubject;
public class Main {
public static void main(String[] args) throws InterruptedException {
PublishSubject<String> data = PublishSubject.create();
//refresh data every second for this demo
//for your use case it's every 5 minutes
data.mergeWith(Observable.interval(1, TimeUnit.SECONDS)
// cause timed side-effect that updates data stream
.doOnNext(n -> data.onNext(n + ""))
.ignoreElements()
.cast(String.class))
.doOnNext(System.out::println)
.toBlocking()
.subscribe();
}
}
import java.util.concurrent.TimeUnit;
进口接收。可观察;
导入rx.subject.PublishSubject;
公共班机{
公共静态void main(字符串[]args)引发InterruptedException{
PublishSubject数据=PublishSubject.create();
//为此演示每秒刷新一次数据
//对于您的用例,每5分钟一次
数据合并(可观察的时间间隔(1,时间单位,秒)
//导致更新数据流的定时副作用
.doOnNext(n->data.onNext(n+“”)
.ignoreElements()
.cast(String.class))
.doOnNext(System.out::println)
.toBlocking()
.subscribe();
}
}
如果多个订阅者正在使用该流,您可能希望查看
.share
,因此每5分钟只发生一次刷新操作。如果我每毫秒发出一次刷新操作,对象创建量不是很大吗?注意:我将保留上次刷新数据的时间,因此必须在初始订阅时检查该时间。我还为我的问题添加了一些代码对不起,我的示例应该是1秒。在您的情况下,需要5分钟。其目的是按照计划刷新,而不是重复检查过时的数据。你也可以考虑使用<代码>可观察的。计时器< /代码>如果<代码>间隔< /代码>不适合你的需要。