Android ScheduledExecutorService scheduleAtFixedRate工作不正常

时间:2013-10-17 10:04:14

标签: android multithreading background-process

我已将ScheduledExecutorService设置为每5秒打印一次:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
    public void run() {
        System.out.println("working");
    }
}, 5, 5, TimeUnit.SECONDS);

一切都很完美,但是在活动进入onPause()加上几分钟后,它开始随机打印。

正常工作的例子:

10-17 11:05:04.865: I/System.out(3863): working: 
10-17 11:05:09.865: I/System.out(3863): working: 
10-17 11:05:14.865: I/System.out(3863): working: 
10-17 11:05:19.865: I/System.out(3863): working: 
10-17 11:05:24.865: I/System.out(3863): working: 
10-17 11:05:29.865: I/System.out(3863): working: 
10-17 11:05:34.865: I/System.out(3863): working: 
10-17 11:05:39.865: I/System.out(3863): working: 
10-17 11:05:44.865: I/System.out(3863): working: 
10-17 11:05:49.855: I/System.out(3863): working: 
10-17 11:05:54.855: I/System.out(3863): working: 
10-17 11:05:59.865: I/System.out(3863): working: 

onPause()活动+几分钟之后它的工作原理:

10-17 11:24:21.825: I/System.out(3959): Fragment onPause
10-17 11:24:35.484: I/System.out(3959): working
10-17 11:24:43.533: I/System.out(3959): working
10-17 11:24:52.084: I/System.out(3959): working
10-17 11:25:15.490: I/System.out(3959): working
10-17 11:25:34.908: I/System.out(3959): working
10-17 11:25:59.146: I/System.out(3959): working
10-17 11:26:18.385: I/System.out(3959): working
10-17 11:26:45.162: I/System.out(3959): working
10-17 11:27:24.991: I/System.out(3959): working
10-17 11:27:55.735: I/System.out(3959): working
10-17 11:28:35.301: I/System.out(3959): working
10-17 11:29:12.415: I/System.out(3959): working

这件事情是正常的吗?是scheduleAtFixedRate的替代品吗? (我不想使用Service,因为在普通应用程序中我将以24小时的速率安排任务,并且我不希望在应用程序未运行时触发此事件,因此AlarmManager不是我也想要。)

1 个答案:

答案 0 :(得分:0)

android文档说明了关于ExecutorService计划任务

  

请注意,相对延迟的到期不需要重合   使用当前由于网络时间而启用任务的日期   同步协议,时钟漂移或其他因素。该   Executors类为其提供了方便的工厂方法   此程序包中提供的ScheduledExecutorService实现。

http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html

也许它是一个时钟漂移的东西,或者可能是一些其他活动线程在前台以更高的优先级执行,你的ES稍后有机会。