2014-02-15 49 views
2

我想实现一项服务,其工作是定期从Internet获取更新。我知道有几种方法可以达到这个目的。我将列出其中2个。请告诉我什么更有效,实际上哪种方式更为常见。在此先感谢Android - 定期服务的最佳实践

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.Schedule AlarmManager定期触发IntentService其获取更新

+0

可能的重复[在后台定期有一个Android应用程序轮询的最佳方式](http://stackoverflow.com/questions/6052426/best-way-to-have-an-android-app- poll-periodic-in-the-background- – ntv1000

回答

5

实现无限的,而(真),一个单独的线程内循环,然后运行该线程服务的onStartCommand。

该模式的更好实施将使用ScheduledExecutorService

请告诉我什么是更高效,更在实践中什么样的方式是比较常见的

两个实现是不一样的东西,所以你比较苹果和桔子。

你的第一种方法 - 无论是使用Thread.sleep()ScheduledExecutorService - 说“做一些事情每隔N毫秒而进程正在运行和唤醒设备”。

你的第二种方法是“无论我的过程状态如何(并且可选地,即使设备入睡),每隔N毫秒执行一次,直到我告诉你停止”。

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

+0

谢谢你的回应,我的目的是实现一个所有时间都在运行的服务,就像一个必须运行的闹钟服务,即使设备是睡着了,用这个条件可以请你帮我哪种方法更好? –

+0

@ABFORCE:你的第二选择('AlarmManager')是唯一可以工作的人。因此,根据定义,这比不适用的方法更好。 – CommonsWare

+0

感谢您的帮助,您的回答对我非常有帮助! –

2

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

+0

谢谢你,这很有帮助 –