RxJava间隔和超时偶尔会停止时Android装置被锁定

问题描述 投票:1回答:2

我的一个应用程序的功能设计5分钟(以防止用户意外地离开它启用)后超时。

活动显示由Observable.interval()更新和特征超时经由Observable.timeout()实现的倒数计时器。

偶尔当倒计时正在运行,并且用户锁定设备,interval()将停止发射和timeout()不会抛出它的超时异常。当设备被解锁,并且活动再次在前台,最终timeout会散发出它是一个不确定的时间后例外。

有人建议在this SO postinterval仅用于“活动代码”,所以我想这是我遇到的问题。

有没有简单的解决方案,可以让我继续使用RxJava这个超时和倒计时,或者我必须寻找其他解决方案,比如AlarmManager?如有特殊Scheduler救援?

android rx-java rx-android
2个回答
1
投票

有人建议在这种SO张贴间隔仅用于“活动代码”,所以我想这是我遇到的问题。

那是对的。一旦手机被锁定,省电功能开始(光线和深瞌睡)踢RxJava的所有“定时”的方法(intervaldelaytimeout)将大大失败。虽然追捕类似的bug我找不到究竟发生了什么事情,但总体秒的间隔可以变成分钟后才能触发,并分钟小时的间隔。

如果非要大胆猜测,我希望它可以给RxJava's logic only executing within specific maintenance windows而屏幕是关闭有关。

有没有简单的解决方案,可以让我继续使用RxJava这个超时和倒计时,或者我必须寻找其他解决方案,比如AlarmManager?

在特定情况下,这取决于正是你想要达到的目标。你想一个精确的时间后,关闭/通知用户?正如你提到的AlarmManager很可能要走的路(JobScheduler是松散的安排,在批与其他应用程序计划的作业运行的作业)。如果你想显示定时器,而应用程序是活跃的,你可以通过存储开始时间的应用程序启动时,然后用Observable.interval更新每隔一定的时间接口(执行当前的时间这样做 - 开始时间计算)。你可能会想,当屏幕关闭时,从这个区间退订。

最后,很简单,但不太可能你需要什么,你可以使用a wake lock to keep the phone awake。该AlarmManagerJobScheduler获取和释放唤醒锁为您服务。

附:考虑到使用异常逻辑(RxJava的timeout)来处理正常的应用程序逻辑可能不是一个好主意。


-2
投票

您可以使用

.subscribeOn(Schedulers.newThread())

但是,你需要确保你正确地取消,而不是克隆多个观测。

© www.soinside.com 2019 - 2024. All rights reserved.