【发布时间】:2012-02-14 22:04:11
【问题描述】:
我的应用每 10 分钟访问一次 Web 服务以访问数据(即使应用不在前台)。最好的方法是什么?
首先我需要在单独的线程中启动我的服务吗? 以及如何使其每 10 分钟从服务器获取更新?有些人说 handler.postdelayed 和一些使用警报管理器。哪个更好,我们有一些例子吗?
【问题讨论】:
标签: java android multithreading android-service
我的应用每 10 分钟访问一次 Web 服务以访问数据(即使应用不在前台)。最好的方法是什么?
首先我需要在单独的线程中启动我的服务吗? 以及如何使其每 10 分钟从服务器获取更新?有些人说 handler.postdelayed 和一些使用警报管理器。哪个更好,我们有一些例子吗?
【问题讨论】:
标签: java android multithreading android-service
如果更新将在您的应用程序运行时发生,您可以使用计时器(如其他答案中所建议的那样)或更新的 ScheduledThreadPoolExecutor。
如果您的应用程序即使在未运行时也会更新,您应该使用AlarmManager:
警报管理器适用于您希望拥有 应用程序代码在特定时间运行,即使您的应用程序是 当前未运行。
请注意,如果您打算在应用程序关闭时更新,则每十分钟更新一次是相当频繁的,因此可能有点太耗电了。
【讨论】:
Jeffrey Sharkey 在Google IO 2009 上就该主题进行了出色的演示,请仔细观看幻灯片 21。
这应该可以很好地介绍有关该主题的最佳做法。
摘录:不要使用处理程序或计时器,请使用 AlarmManager 和 setInexactRepeating(..)。
【讨论】:
实际上,我使用Timer 处理完全相同的情况,它对我有用。
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}}, 60000, 60000);
【讨论】:
您可以使用java.util.Timer 或ScheduledThreadPoolExecutor(首选)来安排在后台线程上定期执行的操作。
这是使用后者的示例:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);