#java #android #timer
#java #Android #таймер
Вопрос:
У меня есть пользовательский таймер, который я синхронизирую с системными часами. Он отлично работает с интервалами в одну минуту, но мне также нужно, чтобы он синхронизировался с интервалами в 36 секунд (для обновления полей, когда пользователь хочет, чтобы время отображалось в десятичных часах). Внутри Runnable
я пересчитываю настройку (достаточно точную для моих нужд) на следующую минуту, но не могу найти способ удобно обрабатывать различные смещения, необходимые для 36 секунд.
Редактировать
private static class DecimalTimer extends TimerClass {
final int[] seconds = new int[101];
private boolean keepRunning = true;
private Runnable mRunnable;
@Override
void kill() {
keepRunning = false;
}
@Override
Runnable getRunnable() {
return mRunnable;
}
DecimalTimer() {
final int[] counter = new int[1];
for (int i = 0, j = 0; i < 3600; i = 36, j ) {
seconds[j] = i;
}
mRunnable = new Runnable() {
@Override
public void run() {
if (!keepRunning)
return;
final Calendar c = Calendar.getInstance();
int hourSeconds = c.get(Calendar.MINUTE) * 60 c.get(Calendar.SECOND);
for (counter[0] = 0; counter[0] < 100; counter[0] ) {
if (seconds[counter[0]] > hourSeconds) {
c.add(Calendar.SECOND, seconds[counter[0]]);
break;
}
}
long adjustedDelay = (c.getTimeInMillis() - System.currentTimeMillis()) % 36000;
for (IntervalTimer listener : sListeners) {
listener.updateTime();
}
sHandler.postDelayed(this, adjustedDelay);
}
};
}
}
Это редактирование запускается каждые 36 секунд, но мне нужно синхронизировать его с 36 секундами на часах (то есть: 12: 00:00, затем 12:00:36 .. 12:01:12 .. 12:01:48)
Ответ №1:
Переосмысливая вещи, как обычно, вот что я придумал. Это достаточно точно для того, что мне нужно, но если у кого-то есть улучшения в точности (это немного не так, когда он выполняется с 900 мс или более), это было бы оценено.
DecimalTimer() {
mRunnable = new Runnable() {
@Override
public void run() {
if (!keepRunning)
return;
final Calendar c = Calendar.getInstance();
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
do {
c.add(Calendar.SECOND, 36);
} while (c.getTimeInMillis() < System.currentTimeMillis());
long adjustedDelay = (c.getTimeInMillis() - System.currentTimeMillis()) % 36000;
for (IntervalTimer listener : sListeners) {
listener.updateTime();
}
sHandler.postDelayed(this, adjustedDelay);
}
};
}