Rx java 我怎样才能拥有一个不会改变流的副作用订阅?

Rx java 我怎样才能拥有一个不会改变流的副作用订阅?,rx-java,Rx Java,情景: 我有一个数据列表(企业事务)。如果满足以下两个条件,则认为该数据已过时: 用户(UI/视图)订阅了数据源(一个rx.Observable) >=自上次网络同步以来已过去5分钟。此值被序列化并从数据库中观察 注意:如果UI/视图未订阅数据源,并且>=5五分钟过去了,我不想同步新数据(因为没有人在侦听) 下面是代码示例的一些详细信息: data.observed()返回rx.observeable void syncIfLast5Minutes()将强制检查过去五分钟内是否有同步,如果

情景:

我有一个数据列表(企业事务)。如果满足以下两个条件,则认为该数据已过时:

  • 用户(UI/视图)订阅了数据源(一个
    rx.Observable
  • >=自上次网络同步以来已过去5分钟。此值被序列化并从数据库中观察
注意:如果UI/视图未订阅数据源,并且>=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分钟。其目的是按照计划刷新,而不是重复检查过时的数据。你也可以考虑使用<代码>可观察的。计时器< /代码>如果<代码>间隔< /代码>不适合你的需要。