【问题标题】:Android service stopsAndroid 服务停止
【发布时间】:2011-02-08 04:35:30
【问题描述】:

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

我正在尝试运行一项服务,该服务将检查我工作的服务器是否正在运行。它应该每 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 - 但我看不出这将如何适用于我的情况。

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

【问题讨论】:

    标签: java android service timer


    【解决方案1】:

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

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

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

    如果您打算在设备进入睡眠状态时也发生这种情况,请使用带有AlarmManager 和我的WakefulIntentService_WAKEUP 警报(或类似的东西)。

    【讨论】:

    • 是的,android 操作系统中的“服务”一词与 Windows 服务完全不同,它永远在后台运行——android 服务只是一个没有前端的应用程序,并且因此受标准内存管理/清理的约束。调用意图的警报绝对是要走的路。
    • 非常感谢 Mark,它成功了 - 它现在已经连续运行了 9 个小时,并在准确的 5 分钟标记处触发 :) - 感谢 Guy 的解释
    • 我面临同样的问题 - 但是我从来没有想过它可能与我们的服务有关......我们有一个运行的服务,然后 Thread.sleeps 会在一段时间后唤醒等等...我想知道这是否相关,因为我遇到了同样的错误。
    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2018-11-11
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多