Проблема синхронизации пользовательского таймера с системными часами

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