Service ScheduleTask不会以固定间隔启动

时间:2012-01-02 15:16:05

标签: java android service scheduled-tasks intervals

我有一项服务需要比较以前和当前的HTML代码。

我已将其配置为每1小时完成一次工作,但实际上它是以奇怪的非线性间隔进行的。我已经在代码中添加了一个编写日志文件的命令,以便在工作完成时查看。结果很奇怪:有时间隔不到一小时,有时甚至更长(2-3小时),有时真的是1小时...... 编辑:当间隔时间较短(1分钟)时,它会正常运行< / strong>这是我的代码:

    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleWithFixedDelay(new Runnable() {

        public void run() {
            try {
                if (isNetworkAvailable()) {
                    doServiceWork();
                    check("SLeEPING!!!", c);
                }
                else {
                    check ("NO INTERNET", c);
                }
            }
            catch (Exception e) {check("78", c);}
        }
    }, 1, 3600, TimeUnit.SECONDS);

}

2 个答案:

答案 0 :(得分:1)

使用AlarmManager。你正在使线程睡眠,我不确定Android保证它将以这种方式工作。这样的事情可以帮助你。这将每小时启动一次服务:

PendingIntent serviceIntent= PendingIntent.getService(context,
                    0, new Intent(context, MyService.class), 0);

            long firstTime = SystemClock.elapsedRealtime();
            AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

            long currenciesIntervalInSec = 3600;

            if (automaticCurrencies)
                am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, currenciesIntervalInSec*1000, serviceIntent);

编辑:

您应该扩展IntentService。它负责线程,一切都在后台完成(如果你需要在后台完成任务并且你不需要同时使用多个线程,它特别有用)。无论您在HandleIntent中放置什么,都将在您启动服务时执行。在内部,它将保留队列列表。

例如,这是一个简单的服务类(您需要创建两个构造函数):

public class MyService extends IntentService {

    public MyService() {
        super("MyService");
    }

    public MyService(String name) {
        super(name);        
    }

    @Override
    protected void onHandleIntent(Intent arg0) {

               if (isNetworkAvailable()) {
                    doServiceWork();
                    check("SLeEPING!!!", c);
                }
                else {
                    check ("NO INTERNET", c);
                }

        }
}

此外,您需要在清单中添加此内容(当然使用您自己的包):

<service android:name="com.services.MyService"/>  

答案 1 :(得分:0)

也许您的活动被Android任务管理器破坏,并且计时器没有关闭它。这就是为什么你得到更短的价值。这就是为什么,当设置一个非常低的值时,你不会得到它。

您应该了解Android如何处理流程和应用程序here