Мой проект Android использует потоки ExecutorServices и Looper.На Oreo, и даже на Marshmallow, я начал испытывать следующую проблему:
К сожалению, так как я обновился до SDK 27, при возврате из doze потоки не возобновятся до нескольких минут спустя.
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 в очередь).
Итак, мои вопросы:
- Каковы ограничения, особенно для потоков, во время окон обслуживания?
- Будильник AlarmManager, предназначенный для обслуживания переднего плана, должен запустить окно обслуживания.Это «ограниченное окно обслуживания»?
- Разве я не получу несколько секунд отсрочки в окне обслуживания?(t3)
- Если Doze активируется после выхода
onStartCommand
- каков наилучший способ вызова заданий вне основного потока, чтобы у меня было несколько секунд для обработки событий и представления отчетасервер перед заморозкой? Задержка основного потока - не вариант , а Firebase очень неточен.
Спасибо