Запуск службы в отдельном потоке и пробуждение через каждые 10 минут?
Мое приложение получит доступ к веб-сервису для доступа к данным (даже если приложение не находится на переднем плане) каждые 10 минут. Каков наилучший способ сделать это?
Сначала мне нужно запустить мой сервис в separate thread?
И как заставить его получать обновления с сервера каждые 10 минут? Некоторые люди сказали handler.postdelayed и некоторые с помощью Alarm Manager. какой из них лучше, и у нас есть несколько примеров.
Ответы
Ответ 1
Если обновления будут выполняться во время работы вашего приложения, вы можете использовать таймер, как предлагается в других ответах, или новый ScheduledThreadPoolExecutor
.
Если ваше приложение будет обновляться, даже если оно не запущено, вы должны пойти с AlarmManager
:
Диспетчер аварийных сигналов предназначен для случаев, когда вы хотите код приложения запускается в определенное время, даже если ваше приложение в настоящее время не работает.
Обратите внимание, что если вы планируете обновлять, когда приложение отключено, то каждые 10 минут достаточно часты и, возможно, могут быть слишком энергоемкими.
Ответ 2
У Джеффри Шарки была отличная презентация на тему Google IO 2009, внимательно следите за слайдом 21.
Это должно дать вам хорошее представление о лучших практиках в этой теме.
Выдержка: не используйте обработчики или таймеры, идите с AlarmManager и setInexactRepeating(..)
.
Ответ 3
Вы можете использовать java.util.Timer или ScheduledThreadPoolExecutor (предпочтительно), чтобы запланировать действие, которое происходит через регулярные интервалы в фоновом потоке.
Вот пример с последним:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);
Ответ 4
Я действительно использовал Timer
для одного и того же случая, и он работает для меня.
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}}, 60000, 60000);