我的一个应用功能设计为在5分钟后超时(以防止用户意外启用它)。
活动显示由Observable.interval()
更新的倒数计时器,功能超时通过Observable.timeout()
实现。
有时,当倒计时正在运行且用户锁定设备时,interval()
将停止发光,timeout()
不会抛出超时异常。当设备解锁并且Activity再次位于前台时,最终timeout
将在不确定的时间后发出它的异常。
this SO post建议interval
仅用于“活动代码”,因此我认为这是我遇到的问题。
是否有简单的解决方案可以让我继续使用RxJava进行此超时和倒计时,或者我是否必须查看其他解决方案,例如AlarmManager
?救援的任何特殊Scheduler
?
答案 0 :(得分:0)
在此SO帖子中建议间隔仅用于“活动” 代码”,因此我认为这是我遇到的问题。
是正确的。一旦手机被锁定并且节电功能开始起作用(轻度和深度打ze),RxJava的所有“定时”方法(interval
,delay
,timeout
)将彻底失败。在寻找类似的错误时,我无法确切找到正在发生的事情,但是总的时间间隔只能在几分钟后以及几分钟的时间间隔内触发。
如果我不得不大胆猜测,我希望这与屏幕关闭时与RxJava's logic only executing within specific maintenance windows有关。
有没有简单的解决方案可以让我继续使用 RxJava的这种超时和倒计时,或者我必须期待其他 解决方案,例如AlarmManager?
在您的特定情况下,这取决于您要实现的目标。您是否想在精确时间后关闭/通知用户?如您所建议的,AlarmManager
可能是可行的方式(JobScheduler
是与其他应用程序计划的作业一起松散地计划批量运行的作业)。如果要在应用程序处于活动状态时显示计时器,可以通过存储应用程序启动时的开始时间,然后使用Observable.interval
定期更新界面(执行当前时间)来执行此操作-开始时间计算)。当屏幕关闭时,您可能希望退订此间隔。
最后,非常简单,但是不太可能需要,可以使用a wake lock to keep the phone awake。 AlarmManager
和JobScheduler
会为您获取并释放唤醒锁。
P.s。考虑使用异常逻辑(RxJava的timeout
)来处理常规应用程序逻辑可能不是一个好主意。
答案 1 :(得分:-2)
您可以使用
.subscribeOn(Schedulers.newThread())
但是你需要确保正确取消订阅,而不是克隆多个observable。