Запуск службы в отдельном потоке и пробуждение через каждые 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);