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