如何在固定时间间隔后使用 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 实现进行轮询?的主要内容,如果未能解决你的问题,请参考以下文章

固定间隔后获取纬度位置

单击保存按钮后或以固定时间间隔如何自动刷新交互式网格?

在固定时间间隔后调用特定方法

MPAndroidChart:如何以固定间隔设置 x 轴标签

如何使用 Qt/QwtPlot 设置固定轴间隔?

固定资产购买日期和入账日期间隔时间长怎么写情况说明