Service ScheduleTask не запускается с постоянными интервалами

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

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

    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);

}

person RE6    schedule 02.01.2012    source источник
comment
Вы отправили этот вопрос дважды. Я вижу 3! вопросы на одну и ту же тему. Как правило, вопрос никогда не бывает «мертвым», пожалуйста, поработайте над своим первым вопросом, связанным с этой темой, и удалите два оставшихся... Совет: попробуйте уменьшить объем кода, представленного в вашем вопросе, просто предоставьте соответствующие части.   -  person home    schedule 02.01.2012
comment
возможный дубликат Service ScheduleTask не запускался с постоянными интервалами   -  person home    schedule 02.01.2012


Ответы (2)


Используйте диспетчер тревог. Вы заставляете поток спать, и я не уверен, что 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);

Редактировать:

Вы должны расширить 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"/>  
person sfratini    schedule 02.01.2012
comment
Ну, я не понял, как применить это к своему коду. Не подскажете чем заменить? - person RE6; 03.01.2012
comment
Хорошо! Я проверю это на пару часов, и я скажу вам, если это сработало - person RE6; 03.01.2012
comment
Конечно. При первом запуске кода он должен запускаться сразу же, поскольку вы устанавливаете первый раз как настоящее время. Это будет выполняться каждый час, даже если ваше приложение не запущено. Вы также можете отменить расписание, вызвав метод отмены для AlarmManager, передающего то же самое намерение. - person sfratini; 03.01.2012
comment
Другая вещь. Внутренние классы собираются очень часто. Если это не сработает, попробуйте создать новый исполняемый класс, правильную переменную, а затем использовать его в службе, используя исходный код. - person sfratini; 03.01.2012

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

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

person Adel Boutros    schedule 02.01.2012
comment
Нет, это абсолютно не то. Я подумал об этом, поэтому я отслеживал, как долго работает служба, и она работает часами без перерыва... - person RE6; 02.01.2012