Android - 定期服务的最佳实践

时间:2014-02-15 14:13:29

标签: android android-service

我想实现一项服务,其工作是定期从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

2 个答案:

答案 0 :(得分:5)

  

在单独的线程中实现无限while(true)循环,然后在服务的onStartCommand中运行此线程。

更好地实施该模式将是使用ScheduledExecutorService

  

请告诉我什么更有效,在实践中哪种方式更常见

这两个实现不是一回事,所以你要比较苹果和橘子。

您的第一种方法 - 无论是使用Thread.sleep()还是ScheduledExecutorService - 说“在进程运行且设备处于唤醒状态时每隔N毫秒做一些事情”。< / p>

你的第二种方法是“每隔N毫秒做一些事情,无论我的过程状态如何(也可选择,即使设备都处于睡眠状态),直到我告诉你停止”。

因此,如果您只需要在流程运行时进行工作,则可以使用第一种方法。在其他情况下使用第二种方法。

答案 1 :(得分:2)

这两种方法都没问题。但我宁愿使用第二种方法,因为在你服务的第一种方法可能会在某个时候被系统强制关闭(在内存不足的低端设备上发霉)并且那一刻可能是关于重新启动线程的时刻因此你将会错过iupdate,是的,它会在以后内存可用时被触发(你必须在创建服务时确保这一点)但我只是在一天结束时说它真的取决于你是否重要跳过任何更新