如何在固定时间间隔后使用IntentService实现轮询?

时间:2013-12-23 09:12:43

标签: java android multithreading intentservice

我有一个要求,我需要对服务器进行轮询,从服务器获取一些事件并对事件执行操作。所有这些都必须以固​​定的时间间隔异步完成。

所以我编写了一个扩展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他们说

  

根据需要启动服务,使用a依次处理每个Intent   工作线程,并在失去工作时自行停止。

所以我的问题是,上述实施中的民意调查会继续进行吗?如果不是,那么上述要求的正确实施是什么。

1 个答案:

答案 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它可能有用。