Java 服务调度任务为';t以恒定的间隔开始

Java 服务调度任务为';t以恒定的间隔开始,java,android,service,scheduled-tasks,intervals,Java,Android,Service,Scheduled Tasks,Intervals,我有一个服务,需要比较以前和当前的html代码 我已经将它配置为每1小时工作一次,但实际上它是以奇怪的非线性间隔工作的。我在代码中添加了一个命令来编写日志文件,以便在工作完成时查看。结果很奇怪:有时间隔不到一个小时,有时更久(2-3个小时),有时真的是一个小时编辑:当间隔较短(1分钟)时,它正常运行以下是我的代码: ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor()

我有一个服务,需要比较以前和当前的html代码

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

    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);

}

可能您的活动被Android任务管理器破坏,而不是被计时器关闭。这就是为什么会得到更短的值。这就是为什么,当设置一个很低的值时,你不能得到它


您应该了解Android如何处理进程和应用程序。

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


您应该了解Android如何处理进程和应用程序。

使用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。它负责线程,所有的事情都是在后台完成的(如果你需要在后台做事情,而不需要同时执行多个线程,那么它特别有用)。您在HandleContent中输入的任何内容都将在启动服务时执行。在内部,它将保留队列的列表

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

此外,您还需要将其添加到您的清单中(当然是与您自己的包一起):


使用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。它负责线程,所有的事情都是在后台完成的(如果你需要在后台做事情,而不需要同时执行多个线程,那么它特别有用)。您在HandleContent中输入的任何内容都将在启动服务时执行。在内部,它将保留队列的列表

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

此外,您还需要将其添加到您的清单中(当然是与您自己的包一起):



您已经提交了两次此问题。我能看见3!涉及同一主题的问题。一般来说,一个问题永远不会“死”,请处理与此主题相关的第一个问题,并删除剩下的两个问题。。。提示:尽量减少问题中提供的代码量,只需提供相关部分。此问题可能重复提交两次。我能看见3!涉及同一主题的问题。一般来说,一个问题永远不会“死”,请处理与此主题相关的第一个问题,并删除剩下的两个问题。。。提示:尽量减少问题中提供的代码数量,只需提供相关部分。可能重复No。绝对不是这样。我想了想,所以我跟踪了服务运行的时间,它运行了几个小时而没有中断……没有。绝对不是这样。我考虑过这个问题,所以我跟踪了服务运行的时间,以及它在没有中断的情况下运行了几个小时……嗯,我不明白如何将它应用到我的代码中。你能告诉我换什么吗?好的!我会检查几个小时,我会告诉你它是否有效。第一次运行代码时,它应该立即运行,因为您将第一次设置为当前时间。即使你的应用没有运行,它也会每一小时运行一次。您还可以在传递相同意图的AlarmManager上调用cancel方法来取消计划。其他事项。内部类经常被收集。如果这不起作用,请尝试创建一个新的可运行类,一个适当的变量,然后使用原始代码在服务上使用它。你能告诉我换什么吗?好的!我会检查几个小时,我会告诉你它是否有效。第一次运行代码时,它应该立即运行,因为您将第一次设置为当前时间。即使你的应用没有运行,它也会每一小时运行一次。您还可以在传递相同意图的AlarmManager上调用cancel方法来取消计划。其他事项。内部类经常被收集。如果这不起作用,请尝试创建一个新的可运行类,一个适当的变量,然后使用原始代码在服务上使用它。
<service android:name="com.services.MyService"/>