Реализация цикла - PullRequest
1 голос
/ 09 марта 2011

Мне нужно внедрить сервис, который должен периодически выполнять короткое задание.Я использовал обработчик с sendmessagedelayed для реализации цикла.Это работает, но есть ли лучший способ?

@Override
    public boolean handleMessage(Message arg0) {
         //do something
         Message msgtx=Message.obtain();
         handler.sendMessageDelayed(msgtx, updaterate);
         return true;
    } 

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Если задача выполняется, скажем, каждые X минут или более, использование обработчика - это нормально.Если задержка между выполнением задачи больше (часы или около того), я рекомендую использовать AlarmManager:

long now = System.currentTimeMillis();
long interval = XXX;// time in milisecs for the next execution
Intent i = new Intent();
i.setClass(this, YourService.class);
i.setAction("some_action_to_indicate_the_task");
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmMgr.set(AlarmManager.RTC_WAKEUP, now + interval, pi);
1 голос
/ 09 марта 2011

Если вы хотите, чтобы эта задача выполнялась, даже если ваше приложение не запущено, используйте AlarmManager. Если вы хотите, чтобы он работал только во время работы приложения, лучше всего использовать обработчик.

Android док говорит:

Примечание. Диспетчер тревог предназначен для случаев, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в данный момент не запущено. Для обычных операций синхронизации (тики, тайм-ауты и т. Д.) Проще и намного эффективнее использовать обработчик.

...