Android服务停止运行。

8

我已经到了快要秃头的地步......

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

我已经尝试了TimerTask、ScheduledExecutorService和最终使用Handler。它们在几个小时内工作得“很好”,除了一些不准确,1-5分钟偏差外,然后突然“计时器”停止触发。

现在,我已经阅读过Scheduler遇到未捕获异常将停止执行的内容。我相信对于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

我查看了关于我的应用程序的最后两条消息,并发现了这个线程 - 但我不知道它如何适用于我的情况。
我真的希望你们有一些关于我做错什么的想法。我已经尝试了几周.. 尝试不同的计时器,让一个计时器尝试捕捉“主”计时器停止并重新启动它,但没有成功,正如我的最后一个实验所显示的那样,似乎这不是计时器的问题.. 我认为..
1个回答

14
我曾经使用过TimerTask,ScheduledExecutorService和Handler。它们在几个小时内都可以正常工作,除了一些不准确的情况,差1-5分钟,然后突然"计时器"停止触发。
当然。这些都不是为您的目的而设计的,因为它们既不保持设备唤醒状态,也不与Android框架很好地配合使用。为了标记时间的流逝而在RAM中拥有一个服务是浪费的,并且随着每次发布,Android变得越来越积极地关闭像这样永久性的服务。
使用AlarmManager设置您的计划并使用IntentService执行实际工作。 IntentService会自动为您提供用于网络I / O的后台线程,并在完成工作时自动关闭服务。
如果您打算即使设备进入睡眠状态也要发生这种情况,请使用AlarmManager的_WAKEUP警报和我的WakefulIntentService(或类似的东西)。

3
是的,在Android操作系统中,“服务”一词与Windows服务完全不同,后者可以在后台永远运行--而安卓中的服务只是一个没有前端界面的应用程序,因此受到标准内存管理/清理的限制。使用闹钟调用意图(Intent)绝对是可行的方式。 - Guy Starbuck
非常感谢你,马克,它奏效了——现在已经连续运行了9个小时,在准确的5分钟标记处触发 :) - 谢谢盖伊的解释。 - noir04
我遇到了同样的问题 - 但我从未想过它可能与我们的服务有关... 我们有一个运行的服务,然后进行线程休眠,一段时间后唤醒等等... 我想知道这是否可能相关,因为我也遇到了相同的错误。 - AgentKnopf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接