0

我正在开发一个应用程序,该应用程序从每天晚上 9 点(AEDT 时间)更新的网页中获取数据。数据在获取后使用共享首选项进行存储。

由于如果我们知道页面自上次获取以来尚未更新,那么获取数据将毫无意义,因此我正在尝试实现以下内容:

1) 获取数据时,设置当前时间的时间戳偏好值
2) 应用程序何时获取数据,检查当前时间是否为“最后一次获取日期的下一个晚上 9 点之后”
3) 如果是,则获取数据,否则显示消息说它不需要更新。

我不确定如何将当前日期存储为可以存储在共享首选项中的原语......也许 System.currentTimeMillis() (返回一个长整数)?这以 UTC 格式返回...需要确保所有设置和检查都使用相同的时区完成...

然后如何检查当前时间是否超过“下一个晚上 9 点”的更新阈值?

(作为故障保险,用户有一个菜单按钮来强制更新 - 如果应用程序确定不需要更新,则会提到该按钮。)

编辑:我想我已经解决了,但仍然会感谢任何反馈或建议 - 见下文。

4

2 回答 2

0

我相信在这种情况下,您将需要在您的应用程序中实现一项服务。只要确保您没有在服务中运行不必要的代码,否则用户的电池会受到打击!请参考此页面http://developer.android.com/reference/android/app/Service.html

于 2011-02-06T04:21:06.783 回答
0

我想我已经想出了一个解决方案。

获取数据后,将完成以下操作...

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


当应用程序启动并正常请求数据时,它现在会......
注意: 页面每天在“9pm 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)
}

这似乎工作正常。我已经使用设置为澳大利亚/ACT 的 DateFormat 对其进行了测试,它似乎可以工作......例如,制作另一个设置为获取时间的日历对象并使用:

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()) );

即使我在手机上使用时区设置,这也向我显示始终正确的输出......我相当确定这个解决方案有效,所以我会将它标记为正确/接受 - 但如果有人注意到错误或有更好的建议,随意贡献!:)

于 2011-02-06T07:11:28.783 回答