Android设备锁定时,RxJava间隔和超时偶尔会停止

时间:2017-08-23 19:29:01

标签: android rx-java rx-android

我的一个应用功能设计为在5分钟后超时(以防止用户意外启用它)。

活动显示由Observable.interval()更新的倒数计时器,功能超时通过Observable.timeout()实现。

有时,当倒计时正在运行且用户锁定设备时,interval()将停止发光,timeout()不会抛出超时异常。当设备解锁并且Activity再次位于前台时,最终timeout将在不确定的时间后发出它的异常。

this SO post建议interval仅用于“活动代码”,因此我认为这是我遇到的问题。

是否有简单的解决方案可以让我继续使用RxJava进行此超时和倒计时,或者我是否必须查看其他解决方案,例如AlarmManager?救援的任何特殊Scheduler

2 个答案:

答案 0 :(得分:0)

  

在此SO帖子中建议间隔仅用于“活动”   代码”,因此我认为这是我遇到的问题。

是正确的。一旦手机被锁定并且节电功能开始起作用(轻度和深度打ze),RxJava的所有“定时”方法(intervaldelaytimeout)将彻底失败。在寻找类似的错误时,我无法确切找到正在发生的事情,但是总的时间间隔只能在几分钟后以及几分钟的时间间隔内触发。

如果我不得不大胆猜测,我希望这与屏幕关闭时与RxJava's logic only executing within specific maintenance windows有关。

  

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

在您的特定情况下,这取决于您要实现的目标。您是否想在精确时间后关闭/通知用户?如您所建议的,AlarmManager可能是可行的方式(JobScheduler是与其他应用程序计划的作业一起松散地计划批量运行的作业)。如果要在应用程序处于活动状态时显示计时器,可以通过存储应用程序启动时的开始时间,然后使用Observable.interval定期更新界面(执行当前时间)来执行此操作-开始时间计算)。当屏幕关闭时,您可能希望退订此间隔。

最后,非常简单,但是不太可能需要,可以使用a wake lock to keep the phone awakeAlarmManagerJobScheduler会为您获取并释放唤醒锁。

P.s。考虑使用异常逻辑(RxJava的timeout)来处理常规应用程序逻辑可能不是一个好主意。

答案 1 :(得分:-2)

您可以使用

.subscribeOn(Schedulers.newThread())

但是你需要确保正确取消订阅,而不是克隆多个observable。