Отправляю данные в БД 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);
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() и в зависимости от этого отправлять запросы, если прошло нужное время.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей