Android / Java - установить и сравнить дату со смещением - PullRequest
0 голосов
/ 06 февраля 2011

Я работаю над приложением, которое получает данные с веб-страницы, которая обновляется в 21:00 (по времени AEDT) каждый день. Данные сохраняются с использованием общих настроек после получения.

Поскольку было бы бессмысленно извлекать данные, если мы знаем, что страница не обновлялась с момента последней загрузки, я пытаюсь реализовать следующее:

1) при получении данных установите значение предпочтения временной метки текущего времени
2) когда приложение получит данные, проверьте, является ли текущее время «после следующих 9 вечера последней даты выборки»
3) если да, извлеките данные, в противном случае отобразите сообщение о том, что обновление не требуется.

Я не уверен, как сохранить текущую дату в качестве примитива, который можно сохранить в общих настройках ... Возможно, System.currentTimeMillis () (возвращает long)? Возвращается в UTC ... необходимо убедиться, что все настройки и проверки выполнены в одном часовом поясе ...

Как мне тогда проверить, превышает ли текущее время порог обновления «следующих 9 вечера»?

(В качестве отказоустойчивого пользователя у пользователя есть кнопка меню для принудительного обновления - которая будет указана, если приложение определит, что обновление не требуется.)

РЕДАКТИРОВАТЬ: Я думаю, что я решил это, но все равно буду благодарен за любые отзывы или предложения - см. Ниже.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

Я думаю, что нашел решение.

Когда данные извлекаются, делается следующее ...

editPrefs.putLong("fetchTime", System.currentTimeMillis());

Когда приложение запускается и данные обычно запрашиваются, оно теперь выполняет ..
( Примечание: Страница обновляется ежедневно в «9:00 AEDT» - (восточное летнее время Австралии), и я предполагаю, чтоизменится на AEST (по восточному поясному времени Австралии), когда закончится переход на летнее время. "Australia / ACT" - это часовой пояс, который проходит по этим зонам)

//create calendar date for update threshold based on last fetch time preference
Calendar updateThresh = new GregorianCalendar(TimeZone.getTimeZone("Australia/ACT"));
updateThresh.setTimeInMillis(prefs.getLong("fetchTime", 0));

//increment day if last fetch was >= 9pm of that day
if (updateThresh.get(Calendar.HOUR_OF_DAY) >= 21)
    updateThresh.add(Calendar.DAY_OF_MONTH, 1);

//set time to 9:00:00pm
updateThresh.set(Calendar.HOUR_OF_DAY , 21);
updateThresh.set(Calendar.MINUTE , 0);
updateThresh.set(Calendar.SECOND , 0);

//check if current date is before or after
if (updateThresh.before(new GregorianCalendar(TimeZone.getTimeZone("Australia/ACT"))))
{
    //update needed (fetch data)
}
else
{
    //update not needed (show message)
}

Кажется, это работает нормально.Я проверил его, используя DateFormat, установленный в Australia / ACT, и он, кажется, работает ... например, Создание другого объекта календаря, для которого установлено время выборки, и использование:

DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(TimeZone.getTimeZone("Australia/ACT"));

testTextField.setText("Last fetch in East AU time: " + df.format(fetchTime.getTimeInMillis()) + 
    "\nUpdate threshold in East AU time: " + df.format(updateThresh.getTimeInMillis()) );

Это показывает, что я всегда правильновывод, даже если я поиграюсь с настройками часового пояса на моем телефоне ... Я вполне уверен, что это решение работает, поэтому я отмечу его как правильное / принятое - но если кто-то заметит ошибку или предложит лучшее предложение, не стесняйтесьделать вклад!:)

0 голосов
/ 06 февраля 2011

Я полагаю, что в этом случае вам нужно будет внедрить службу в ваше приложение.Просто убедитесь, что вы не запускаете ненужный код в вашем сервисе, иначе батарея пользователя получит удар!Пожалуйста, обратитесь к этой странице http://developer.android.com/reference/android/app/Service.html

...