首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务ScheduleTask不是按固定间隔启动的

服务ScheduleTask不是按固定间隔启动的
EN

Stack Overflow用户
提问于 2012-01-02 15:16:05
回答 2查看 118关注 0票数 1

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

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

代码语言:javascript
复制
    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);

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-02 19:58:22

使用AlarmManager。您正在使线程睡眠,我不确定Android保证它会那样工作。像这样的东西应该对你有帮助。这将每小时启动一次服务:

代码语言:javascript
复制
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中的任何内容都将被执行。在内部,它将保留队列的列表。

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

代码语言:javascript
复制
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);
                }

        }
}

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

代码语言:javascript
复制
<service android:name="com.services.MyService"/>  
票数 1
EN

Stack Overflow用户

发布于 2012-01-02 15:22:54

也许你的活动被Android任务管理器破坏了,而不是被定时器关闭。这就是为什么你会得到更短的值。这就是为什么,当设定一个非常低的值时,你不会明白这一点。

您应该了解一下Android如何处理进程和应用程序这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8702413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档