Android服务停止

时间:2011-02-07 20:07:09

标签: java android service timer

我已经到了离秃顶只有几步之遥的地步......

我正在尝试运行一项服务,检查我工作的服务器是否正在运行。它应该每5分钟做一次。

我经历过TimerTask,ScheduledExecutorService,最后是Handler。 他们都工作“好”几个小时,除了一些不准确,1-5分钟关闭,然后突然“计时器”停止射击。

现在,我已经读过调度程序在遇到未被捕获的异常时会停止,并且我确定TimerTask的情况也是如此 - 但是检查日志文件时,根本没有任何异常。 ..

今天下班回家后,我决定用Handler做一个实验。

我创建了2个处理程序,一个将运行代码来检查服务器并一次增加一个int。另一个只是记录所述int的值,以便在遇到异常时不停止(我看不出它会怎样)。

它运行良好,通常1-5分钟不准确,几个小时然后停止,下面是日志的最后一行:

02-07 20:03:25.892 D/dalvikvm(  992): GC_EXPLICIT freed 192K, 53% free 4295K/9031K, external 3755K/4825K, paused 114ms
02-07 20:03:35.572 D/dalvikvm( 5472): GC_EXPLICIT freed <1K, 54% free 2895K/6279K, external 2002K/2137K, paused 61ms
02-07 20:04:42.212 V/ServerChecker(12568): Timer triggered
02-07 20:04:42.212 V/ServerChecker(12568): Checking: linux15
02-07 20:04:44.152 V/ServerChecker(12568): Checked: linux15
02-07 20:04:44.152 V/ServerChecker(12568): Checking: linux1
02-07 20:04:44.462 V/ServerChecker(12568): Checked: linux1
02-07 20:04:44.462 V/ServerChecker(12568): Checking: linux12
02-07 20:04:44.762 V/ServerChecker(12568): Checked: linux12
02-07 20:04:44.762 V/ServerChecker(12568): Checking: linux9
02-07 20:04:45.072 V/ServerChecker(12568): Checked: linux9
02-07 20:04:45.072 V/ServerChecker(12568): Checking: linux14
02-07 20:04:45.382 V/ServerChecker(12568): Checked: linux14
02-07 20:04:45.382 V/ServerChecker(12568): Test timer triggered: 13
02-07 20:05:01.002 E/InputDispatcher(  223): channel '406cefc8 com.n04dev.serverchecker/com.n04dev.serverchecker.ServerChecker (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
02-07 20:05:01.002 E/InputDispatcher(  223): channel '406cefc8 com.n04dev.serverchecker/com.n04dev.serverchecker.ServerChecker (server)' ~ Channel is unrecoverably broken and will be disposed!
02-07 20:05:08.932 D/dalvikvm(12842): GC_EXPLICIT freed 73K, 51% free 2641K/5379K, external 2002K/2137K, paused 37ms
02-07 20:05:09.132 D/dalvikvm(  185): GC_EXPLICIT freed 11K, 53% free 2554K/5379K, external 2002K/2137K, paused 96ms
02-07 20:05:12.022 D/dalvikvm(  185): GC_EXPLICIT freed <1K, 53% free 2554K/5379K, external 2002K/2137K, paused 164ms
02-07 20:05:12.062 D/dalvikvm(  185): GC_EXPLICIT freed <1K, 53% free 2554K/5379K, external 2002K/2137K, paused 36ms
02-07 20:05:18.612 D/dalvikvm(12852): GC_EXPLICIT freed 59K, 52% free 2596K/5379K, external 2002K/2137K, paused 72ms

我查看了有关我的应用的最后两条消息并找到this thread - 但我看不出这在我的情况下会如何适用。

我真的希望你们对我做错了什么有所了解。我已经使用了好几个星期..尝试不同的计时器,有一个计时器试图抓住“主”计时器停止然后重新启动它,但没有运气,并且正如我上一次实验所示,它似乎不是计时器有问题..我想..

1 个答案:

答案 0 :(得分:14)

  

我经历过TimerTask,ScheduledExecutorService,最后是Handler。他们都工作“好”几个小时,除了一些不准确,1-5分钟关闭,然后突然“计时器”停止射击。

当然。这些都不是为了您的目的而设计的,因为它们既不会使设备保持清醒,也不能很好地与Android框架配合使用。为了标记时间的流逝,在24x7 RAM中提供服务是非常浪费的,而且在关闭像这样的永久性服务的每一次发布时Android都会变得更加积极。

使用AlarmManager设置日程安排,使用IntentService进行实际工作。 IntentService会自动为您的网络I / O提供后台线程,并在工作完成后自动关闭服务。

如果您打算即使设备处于睡眠状态也会发生这种情况,请使用_WAKEUP警报AlarmManagerWakefulIntentService警告(或其他内容)。