如何在固定时间间隔后使用 IntentService 实现进行轮询?
Posted
技术标签:
【中文标题】如何在固定时间间隔后使用 IntentService 实现进行轮询?【英文标题】:How to poll using IntentService implementation after fixed time interval? 【发布时间】:2013-12-23 09:12:43 【问题描述】:我有一个要求,我需要对服务器进行轮询,从服务器获取一些事件并对这些事件执行操作。所有这些都必须异步并定期完成。
所以我编写了一个扩展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中,它从服务器获取一些事件列表,并根据事件执行任务。
在android website 他们说
服务根据需要启动,依次使用 工作线程,并在工作结束时自行停止。
所以我的问题是,轮询会在上述实施中继续吗?如果不是上述要求的正确实现。
【问题讨论】:
【参考方案1】:对于需要定期在服务中完成的后台任务,您应该使用 AlarmManager 以所需的时间间隔启动您的服务。该服务在工作完成后关闭,并再次启动并发出警报。您还可以在服务中安排或禁用警报等等....尝试用谷歌搜索该方向的答案。
长时间运行的线程不是进行服务器轮询的安全或可靠方式,尤其是在 IntentService 中。您永远无法知道您的服务会发生什么,并且至少可以说保持线程处于活动状态并在后台服务中运行并使用计时器被认为不是一种好的编程习惯。
为什么?例如。 :How do I keep the Thread of an IntentService alive?
所以正确的方法是“常规”Service + 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 文档说 BroadCast onReceive 方法应该用于更长的操作,而不是你应该在那里启动一个服务并让它完成工作。
也可以看看这个http://developer.android.com/google/gcm/index.html & http://developer.android.com/google/gcm/index.html 它可能有用。
【讨论】:
以上是关于如何在固定时间间隔后使用 IntentService 实现进行轮询?的主要内容,如果未能解决你的问题,请参考以下文章