我的Android项目使用ExecutorServices和Looper线程。 在奥利奥(Oreo)甚至棉花糖上,我开始遇到以下问题:
不幸的是,由于我已升级到SDK 27,因此从休眠状态返回时,线程要等几分钟后才能恢复。
t1: Receiving event
FG Service Starts, and creates a job for thread T.
FG Service onStartCommand exits - thread T still running
t2 - may be milliseconds later: Doze. T is frozen (not blocked, just not executing).
t3: Maintenance Window: Some AlarmManager event or Push
starts and finishes. T is still frozen.
t4 - minutes later: Another maintenance window. T wakes up where it stopped on t2.
在阶段t2,不一定是使T进入睡眠状态的阻塞触发器。可以是对HTTP发布的调用,也可以是handle.post{}
的调用(这只是将Runnable放入队列中)。
所以,我的问题是:
onStartCommand
退出后Doze处于忙碌状态-最好的做法是在主线程外调用作业,以确保我确实有几秒钟的时间来处理事件并向服务器报告冻结? 不能选择主线程,并且Firebase不太准确。谢谢