Запросы идут раньше чем надо при использовании scheduleAtFixedRate

422
07 февраля 2017, 19:51

Отправляю данные в БД MySQL каждые 20 секунд посредством scheduleAtFixedRate.
Первый запрос происходит по времени ровно через 20 секунд, но затем начинается "каша": запрос повторяется когда захочет, а не по интервалу в 20 секунд.
Смотрю в логах - идет отправка чуть ли не каждую секунду, а порой за одну секунду чуть ли не по 3 раза.

task = new TimerTask() {
    @Override
    public void run() {
        now = new Date();
        times = DateFormat.getTimeInstance(DateFormat.SHORT).format(now);
        Log.d(LOGSERVICE,"moe tekuweee vrema" + times);
        Sender s = new Sender(getApplicationContext(), number, urlAddress,
                mlatitude, mlogtud, id, status);
        s.execute();
    }
};
timer = new Timer();
timer.scheduleAtFixedRate(task, 0, 20000);
Answer 1

Android не является системой Real Time, то есть точность исполнения не поддерживается на уровне оси. В данном случае, если внимательно прочитать синопсис метода scheduleAtFixedRate(), то вы прочтете:

In fixed-rate execution, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).

По русски говоря не гарантируется точность выполнения через заданные интервалы, более-менее гарантируется их периодичность на длинном промежутке.

Я бы вам посоветовал вычислять время через System.currentTimeMillis() и в зависимости от этого отправлять запросы, если прошло нужное время.

READ ALSO
Нечеткий поиск подстроки в строке

Нечеткий поиск подстроки в строке

ЗдравствуйтеНеобходимо реализовать на Java поиск подстроки в строке

475
Активировать код на нажатие клавиши

Активировать код на нажатие клавиши

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

429
RecyclerView - айтемы, не имеющие позиции

RecyclerView - айтемы, не имеющие позиции

Сделал сетку 10*10 с помощью RecyclerView + GridLayoutManagerВ разметку хочу добавить буквы от А до К над сеткой и цифры от 1 до 10 слева от сетки

512
mysql в java,как получить значение из столбца [требует правки]

mysql в java,как получить значение из столбца [требует правки]

доброго времени суток!есть такая проблема:я хочу присоединится с бд?И получить значения допустим строку,и если можно-посоветуйте книгу для...

503