java - 安卓服务停止

标签 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 - 但我看不出这将如何适用于我的情况。

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

最佳答案

I've been through TimerTask, ScheduledExecutorService and finally Handler. They all work "fine" for a few hours, except for some inaccuracy, 1-5 mins off, and then suddenly the "timer" just stops firing.

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

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

如果您打算在设备进入休眠状态时也发生这种情况,请将 _WAKEUP 警报与 AlarmManager 和我的 WakefulIntentService 一起使用(或类似的东西)。

关于java - 安卓服务停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925965/

相关文章:

安卓 : Is there anyway to get battery capacity of a device in mah?

android - 如何找到 android 项目支持的实际最小 API 级别?

c++ - 使用 C++ 实现操作系统服务之间的通信

spring - @Service 注释应该保存在哪里?接口(interface)还是实现?

c++ - Windows 服务无法识别网络路径。解决方法是什么?

java - java最长公共(public)子序列(递归)

java.lang.UnsatisfiedLinkError : Couldn't load from loader findLibrary returned null

java - 通过命令行与 iptables 交互

java - 使用 JCR 与 J2EE 客户端服务器环境中的各种内容存储库进行交互的标准接口(interface)

android - 类路径中的某些运行时 JAR 文件具有不兼容的版本。考虑从类路径中删除它们