@yakovenkodenis
JavaScript, Node.js, React, PostgreSQL

Как реализовать таймер, работающий на массиве дат?

Приветствую!

Есть такая задача:
Нужно создать CountDownTimer, который бы отсчитывал время на массиве дат, т.е., к примеру, имеется массив
["12.04.2015 19:50", "13.04.2015 11:45", "17.05.2015 07:45"]
и нужно, чтобы таймер в приложении отсчитывал время сначала до первого элемента массива, потом до второго и так далее до конца, ну и чтобы показывал всё это в TextView.

Возможно, таймер можно перезапускать как-нибудь, когда он доходит до 00:00? Или нужно как-нибудь перегрузить метод onFinish()?

Подскажите, пожалуйста, как это можно реализовать? Ну или может кто-то сможет поделиться кусочком кода)
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
timych
@timych
Вот наваял (надеюсь что правильно понял задачу):
package application;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @author Timur Nikiforov
 */
public class Clazz {

	private Timer dateTimer;

	private Timer remainderTimer;

	private Date nextDate;

	private boolean remainderTimerStarted;
	
	private static final long REMINDER_UPDATE_INTERVAL = 1000; 

	private static final String[] DATES = { "12.04.2015 19:56", "12.04.2015 19:57", "12.04.2015 19:58" };

	private int currentIndex;

	public Clazz() {
		dateTimer = new Timer();
	}

	public static void main(String[] args) {
		Clazz instance = new Clazz();
		instance.run();
	}

	private void run() {
		nextDate = parseDate(DATES[currentIndex]);
		schedule();
	}

	public void schedule() {
		runSecondsCounter();
		dateTimer.schedule(new TimerTask() {

			@Override
			public void run() {

				System.out.println("Current date is:" + new Date());
				currentIndex++;
				if (currentIndex < DATES.length) {
					nextDate = parseDate(DATES[currentIndex]);
					System.out.println("Next date is:" + nextDate);
					schedule();
				} else {
					remainderTimer.cancel();
				}
			}
		}, nextDate);

	}

	private Date parseDate(String nextDate) {
		Date date = null;
		DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm",
				Locale.ENGLISH);
		try {
			date = format.parse(nextDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	private void runSecondsCounter() {
		if (remainderTimerStarted) {
			remainderTimer.cancel();
		}

		remainderTimer = new Timer();
		remainderTimer.scheduleAtFixedRate(new TimerTask() {

			@Override
			public void run() {
				remainderTimerStarted = true;
				long remains = nextDate.getTime() - new Date().getTime();
				System.out.println("Remains: " + (remains / 1000) + " seconds");
			}
		}, REMINDER_UPDATE_INTERVAL, REMINDER_UPDATE_INTERVAL);
	}
}


Разберетесь без комментов?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы