Сервис ScheduleTask не запускается через постоянные интервалы - PullRequest
1 голос
/ 02 января 2012

У меня есть служба, которая должна сравнивать предыдущий и текущий HTML-код.

Я настроил его так, чтобы он выполнял свою работу каждые 1 час, но на самом деле он делает это через странные нелинейные интервалы. Я добавил в код команду для записи файла журнала, чтобы видеть, когда работа выполнена. Результат странный: иногда интервал меньше часа, иногда намного больше (2-3 часа), а иногда действительно 1 час ... редактировать: когда интервал короче (1 минута), он работает нормально вот мой код:

    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleWithFixedDelay(new Runnable() {

        public void run() {
            try {
                if (isNetworkAvailable()) {
                    doServiceWork();
                    check("SLeEPING!!!", c);
                }
                else {
                    check ("NO INTERNET", c);
                }
            }
            catch (Exception e) {check("78", c);}
        }
    }, 1, 3600, TimeUnit.SECONDS);

}

Ответы [ 2 ]

1 голос
/ 02 января 2012

Используйте AlarmManager. Вы заставляете поток спать, но я не уверен, что Android гарантирует, что он будет работать таким образом. Нечто подобное должно помочь вам. Это будет запускать услугу каждый час:

PendingIntent serviceIntent= PendingIntent.getService(context,
                    0, new Intent(context, MyService.class), 0);

            long firstTime = SystemClock.elapsedRealtime();
            AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

            long currenciesIntervalInSec = 3600;

            if (automaticCurrencies)
                am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, currenciesIntervalInSec*1000, serviceIntent);

Edit:

Вы должны расширить IntentService. Он заботится о потоках, и все делается в фоновом режиме (это особенно полезно, если вам нужно делать вещи в фоновом режиме, и вам не нужно несколько потоков одновременно). Все, что вы указали в HandleIntent, будет выполнено при запуске службы. Внутренне он будет хранить список очереди.

Например, это простой класс обслуживания (вам нужно создать оба конструктора):

public class MyService extends IntentService {

    public MyService() {
        super("MyService");
    }

    public MyService(String name) {
        super(name);        
    }

    @Override
    protected void onHandleIntent(Intent arg0) {

               if (isNetworkAvailable()) {
                    doServiceWork();
                    check("SLeEPING!!!", c);
                }
                else {
                    check ("NO INTERNET", c);
                }

        }
}

Кроме того, вам нужно добавить это в свой манифест (конечно, с вашим собственным пакетом):

<service android:name="com.services.MyService"/>  
0 голосов
/ 02 января 2012

Возможно, ваша активность уничтожена диспетчером задач Android и не отключена таймером.Вот почему вы получаете более короткие значения.И именно поэтому, при установке очень низкого значения, вы этого не получите.

Вы должны прочитать о том, как Android обрабатывает процессы и приложения здесь .

...