我有一个要求,我需要对服务器进行轮询,从服务器获取一些事件并对事件执行操作。所有这些都必须以固定的时间间隔异步完成。
所以我编写了一个扩展IntentService
的类,并在其onHandleIntent
方法中启动了我的线程。
代码如下: -
的 MyService.java
public class MyService extends IntentService{
private String tag = "MyService";
public MyService() {
super("MyService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d(tag, "onHandleIntent");
TestThread.startThread();
}
}
TestThread.java
public class TestThread {
private static Timer threadTimer = new Timer();
private static long pollingInterval = 5000;//in milliseconds
private static boolean pollingStarted = false;
public static void startThread() {
threadTimer.schedule(new TestTimer(), 0, pollingInterval);
pollingStarted= true;
}
private static class TestTimer extends TimerTask {
@Override
public void run() {
//get event lists
//do some work on the even list
}
}
}
在TestThread.java中,它从服务器获取一些事件列表,并根据事件执行任务。
根据需要启动服务,使用a依次处理每个Intent 工作线程,并在失去工作时自行停止。
所以我的问题是,上述实施中的民意调查会继续进行吗?如果不是,那么上述要求的正确实施是什么。
答案 0 :(得分:1)
对于需要定期在服务中完成的后台任务,您应该使用AlarmManager以所需的时间间隔启动服务。工作完成后服务将关闭,并再次启动警报。您还可以在服务中安排或禁用闹钟等等....尝试google-ing以获得该方向的答案。
长时间运行的线程不是一种安全或可靠的方式来进行服务器轮询,尤其是在IntentService中。你永远不会知道你的服务会发生什么,保持一个活跃的线程并在一个带有计时器的后台服务中运行,至少可以说是一个不错的编程习惯。
为什么呢?对于前:How do I keep the Thread of an IntentService alive?
所以正确的方法是“常规”服务+ AlarmManager 。
Android Polling from a Server periodically
编辑:
*****有些答案表明你不需要为期刊任务提供服务:**
Running task periodicaly(once a day/once a week)
How to poll a webservice at finite interval from android?
它尝试你可以在你的报警管理器onReceive方法中做你的代码,但如果你计划在你的代码中做一些大量的工作,我会建议不要这样做,因为android doc说BroadCasts onReceive方法应该用于更长的操作,而不是你应该在那里开始服务并让它完成工作。
也许可以看看这个http://developer.android.com/google/gcm/index.html& http://developer.android.com/google/gcm/index.html它可能有用。