我的一个应用程序的功能设计5分钟(以防止用户意外地离开它启用)后超时。
活动显示由Observable.interval()
更新和特征超时经由Observable.timeout()
实现的倒数计时器。
偶尔当倒计时正在运行,并且用户锁定设备,interval()
将停止发射和timeout()
不会抛出它的超时异常。当设备被解锁,并且活动再次在前台,最终timeout
会散发出它是一个不确定的时间后例外。
有人建议在this SO post即interval
仅用于“活动代码”,所以我想这是我遇到的问题。
有没有简单的解决方案,可以让我继续使用RxJava这个超时和倒计时,或者我必须寻找其他解决方案,比如AlarmManager
?如有特殊Scheduler
救援?
有人建议在这种SO张贴间隔仅用于“活动代码”,所以我想这是我遇到的问题。
那是对的。一旦手机被锁定,省电功能开始(光线和深瞌睡)踢RxJava的所有“定时”的方法(interval
,delay
,timeout
)将大大失败。虽然追捕类似的bug我找不到究竟发生了什么事情,但总体秒的间隔可以变成分钟后才能触发,并分钟小时的间隔。
如果非要大胆猜测,我希望它可以给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
获取和释放唤醒锁为您服务。
附:考虑到使用异常逻辑(RxJava的timeout
)来处理正常的应用程序逻辑可能不是一个好主意。
您可以使用
.subscribeOn(Schedulers.newThread())
但是,你需要确保你正确地取消,而不是克隆多个观测。