Гарантированное пробуждение AsyncTask после Thread.sleep

У меня есть служба переднего плана, которая создает асинхронную задачу в onCreate(). Асинтаск имеет while(true)в своем doInBackground. В этой функции он выполняет определенную сетевую операцию и переходит в спящий режим на случайный интервал после каждой итерации. Вот логика:

doInBackground(){
     while(true){
         //Do network operation
         //randomNumber is a random number calculated each iteration and is in range of 60-180
         Thread.sleep(randomoNumber*1000);
     }

}

Теперь моя проблема заключается в том, что как только устройство переходит в спящий режим, оно также спит асинтаск. Работа сети очень важна для соблюдения временного интервала (randomNumber), и нельзя допустить, чтобы он спал больше, чем randomNumber секунд (хотя разница в несколько секунд может быть допустима). Итак, как я могу гарантировать, что асинхронная задача просыпается после Thread.sleep, даже если устройство не находится в активном состоянии? Я думаю, что могу использовать wakelock, но это может заставить задачу работать вечно, поскольку она имеет цикл while (true) и, следовательно, разряжает батарею. Если я использую его перед Thread.sleep и отпускаю после сетевой операции, снова может возникнуть та же проблема, когда задача не просыпается после thread.sleep. Итак, что здесь можно сделать?


person rahulserver    schedule 21.05.2014    source источник
comment
Используйте AlarmManager с бодрствующим намерением.   -  person 323go    schedule 21.05.2014
comment
@ 323go Я уже использую AlarmManager с PendingIntent для вызова startService каждую 1 минуту. Я предполагаю, что это также должно разбудить AsyncTask, если он заснул. Но это так не работает.   -  person rahulserver    schedule 21.05.2014
comment
Вам не понадобится AsyncTask. Просто запустите новый поток, чтобы выполнить вашу сетевую транзакцию, когда вы работаете с бодрствующим намерением.   -  person 323go    schedule 21.05.2014


Ответы (1)


Вы можете принудительно включить ЦП, даже когда устройство находится в спящем режиме, см. здесь http://developer.android.com/training/scheduling/wakelock.html#cpu как говорится:

Одним из законных случаев использования блокировки пробуждения может быть фоновая служба, которой необходимо захватить блокировку пробуждения, чтобы ЦП продолжал работать, пока экран выключен.

person Alexander Kulyakhtin    schedule 21.05.2014
comment
Как я уже упоминал в своем вопросе, это быстро разрядит всю батарею. - person rahulserver; 21.05.2014