我想实现一项服务,其工作是定期从Internet获取更新。我知道有几种方法可以达到这个目的。我将列出其中的2个。请告诉我什么更有效,在实践中哪种方式更常见。提前致谢
1.在单独的线程中实现无限while(true)循环,然后在服务的onStartCommand
中运行该线程。伪代码:
class Updater extends Service {
...
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
while (true){
// fetching update...
Thread.sleep(FOR_A_WHILE);
}
}
}).start();
}
...
}
2.安排AlarmManager
定期触发获取更新的IntentService
答案 0 :(得分:5)
在单独的线程中实现无限while(true)循环,然后在服务的onStartCommand中运行此线程。
更好地实施该模式将是使用ScheduledExecutorService
。
请告诉我什么更有效,在实践中哪种方式更常见
这两个实现不是一回事,所以你要比较苹果和橘子。
您的第一种方法 - 无论是使用Thread.sleep()
还是ScheduledExecutorService
- 说“在进程运行且设备处于唤醒状态时每隔N毫秒做一些事情”。< / p>
你的第二种方法是“每隔N毫秒做一些事情,无论我的过程状态如何(也可选择,即使设备都处于睡眠状态),直到我告诉你停止”。
因此,如果您只需要在流程运行时进行工作,则可以使用第一种方法。在其他情况下使用第二种方法。
答案 1 :(得分:2)
这两种方法都没问题。但我宁愿使用第二种方法,因为在你服务的第一种方法可能会在某个时候被系统强制关闭(在内存不足的低端设备上发霉)并且那一刻可能是关于重新启动线程的时刻因此你将会错过iupdate,是的,它会在以后内存可用时被触发(你必须在创建服务时确保这一点)但我只是在一天结束时说它真的取决于你是否重要跳过任何更新