Rx java 如何防止可观测对象排队等待计时器迭代

Rx java 如何防止可观测对象排队等待计时器迭代,rx-java,rx-android,Rx Java,Rx Android,我正在使用以下可观察项执行常规任务。当类第一次加载到内存中时,启动Observable,然后定期执行我的代码。由于它是一个单一的可观察对象,因此可以保证(从我的测试中可以看出,这是一个假设),如果代码运行的时间超过了时间间隔,则不会再次启动并并行处理代码 private static Subscription subscription = Observable.timer(0, 1000, TimeUnit.MILLISECONDS) .flatMap(new Func1<

我正在使用以下可观察项执行常规任务。当类第一次加载到内存中时,启动Observable,然后定期执行我的代码。由于它是一个单一的可观察对象,因此可以保证(从我的测试中可以看出,这是一个假设),如果代码运行的时间超过了时间间隔,则不会再次启动并并行处理代码

private static Subscription subscription = Observable.timer(0, 1000, TimeUnit.MILLISECONDS)
        .flatMap(new Func1<Long, Observable<String>>() {
            @Override public Observable<String> call(Long aLong) {

                // some code

                return Observable.just(null);
            }
        }).subscribeOn(Schedulers.newThread()).observeOn(Schedulers.newThread())
        .subscribe();
private static Subscription=Observable.timer(0,1000,TimeUnit.ms)
.flatMap(新函数1(){
@覆盖公共可观察呼叫(长期){
//一些代码
返回可观察值。just(null);
}
}).subscribeOn(Schedulers.newThread()).observeOn(Schedulers.newThread())
.subscribe();
但这也有一个缺点,rxjava会累积延迟的排放,并在延迟迭代完成后以快速的顺序启动它们。示例:如果定时器编程为每1000毫秒迭代一次,迭代n需要5000毫秒,则迭代n+1、n+2、n+3等将依次启动,但不遵循定时器间隔

private static Subscription subscription = Observable.timer(0, 1000, TimeUnit.MILLISECONDS)
        .flatMap(new Func1<Long, Observable<String>>() {
            @Override public Observable<String> call(Long aLong) {

                // some code

                return Observable.just(null);
            }
        }).subscribeOn(Schedulers.newThread()).observeOn(Schedulers.newThread())
        .subscribe();
没那么糟糕,但真正的问题是安卓睡眠几个小时后会发生什么。因为一旦设备唤醒,rxjava会以快速的顺序启动所有错过的迭代,这会对性能造成相当大的影响

我如何告诉rxjava忘记错过的迭代?如果迭代需要更长的时间,我希望计时器在迭代完成时启动,或者我希望放弃错过的迭代,在到期时启动下一个迭代。我尝试使用sample()和其他过滤器,但不知怎么的,它并没有给我想要的效果,或者我不知道如何正确地应用它们


请注意,我不想为每次迭代创建一个新的Observable(我可以使用zip),因为我想确保代码不是从多个线程执行的。

当您的Android设备处于睡眠模式时,不要要求Rx跳过某些事件。但是停止接收

当你订阅一个流时,你有一个处理程序来取消订阅这个流

Subscription subscription = Observable.timer(1, SECONDS).subscribe();
在活动的
OnPause()
方法中,可以通过调用订阅上的
unsubscribe()
方法来停止流

@Override
public void onPause() {
    subscription.unsubscribe();
}
在活动的
onResume()
方法中,您可以再次订阅流

@Override
public void onResume() {
   subscription = Observable.timer(1, SECONDS).subscribe();
}

我的解决方案是:当设备醒来时调用
subscribe
,当设备睡眠时调用
unsubscribe
。是的,我完全同意你的看法。当设备休眠时,这不是使Rx跳过事件的正确方法。唯一的解决办法是停止接收。所以这需要实施但除此之外,还有一个问题,迭代可能需要更长的时间[想象一下对REST端点的调用,其中端点不可访问并且需要一些时间超时],在这种情况下,我希望跳过事件。我们可以将两者结合起来吗?我会在每次调用函数时保存当前时间,并将其与上次运行时进行比较。如果是750毫秒前的kess,我会完全跳过身体。