【问题标题】:Timer task is misbehaving in service定时器任务在服务中行为不端
【发布时间】:2015-11-01 22:30:41
【问题描述】:

我正在使用计时器任务以固定的时间间隔执行 asynctask,时间为五分钟。但是计时器任务有时会开始行为不端,就像它没有得到一样 事实上,它在固定延迟时会在 10 分钟后执行两次,而不是每 5 分钟执行一次,为什么会这样?

这是我的代码

    Timer timer = new Timer();
            mytimer Mytimer = new mytimer();

            timer.scheduleAtFixedRate(Mytimer, 300000, 300000);


class Mytimer extends TimerTask {
        @Override
        public void run() {
            // TODO Auto-generated method stub

            new DetailPosition().execute();
        }
    }

所以请帮帮我

【问题讨论】:

  • 发布您的代码。对于初学者,您可能根本不应该使用Timer。间隔做事的“Android方式”是通过Handler#postDelayed(...)
  • @KevinKrumwiede 添加有问题的代码,请查看..
  • 我喜欢“行为不端”这个词 :)
  • The docs 声明“必须在 UI 线程上创建任务实例”和“必须在 UI 线程上调用execute(Params...)”。你违反了这两条规则。放弃Timer 并使用Handler

标签: android timertask


【解决方案1】:

如果计时器任务安排在所有线程都在使用的线程池中,那么它必须等待一个线程可用,然后才能运行您的任务。

考虑以下 -

 ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();    
ses.scheduleAtFixedRate(() -> {Thread.sleep(500); System.out.println(new Date());}, 0, 200, TimeUnit.MILLISECONDS);

这里任务花费的时间比间隔时间长,所以任务只会排队,直到你的内存用完。

【讨论】:

  • 我同意这种情况,但有时计时器会执行一次,我在服务器上同时获得了两个具有不同数据的条目,并且它不会在日志中打印同时执行两次的日志
  • @Edward 您是否正在使用相同的线程池来处理可能会阻塞它的其他任何事情?
  • 我在服务中使用它,我不知道如何检查线程池,所以请你告诉我,然后我会检查并告诉你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2013-08-07
  • 2019-01-04
  • 2016-02-21
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多