处理程序在Android中无法可靠工作

处理程序在Android中无法可靠工作,android,service,handler,Android,Service,Handler,我已经编写了一个使用处理器的应用程序。在处理程序内部有一些网络操作。 处理程序的间隔为min*1000*60 ms。我使用的处理程序的最小值为5,因此它应该在五分钟后重复。但这是我检查的结果: 第一处理程序: 16:20:22 16:25:23 17:01:52 17:13:07 17:20:19 17:25:55 第二个处理程序: 16:20:26 16:25:26 17:01:35 17:12:51 17:20:02 17:25:37 16:24:58 16:31:59 17:12:43

我已经编写了一个使用处理器的应用程序。在处理程序内部有一些网络操作。 处理程序的间隔为min*1000*60 ms。我使用的处理程序的最小值为5,因此它应该在五分钟后重复。但这是我检查的结果:

第一处理程序:

16:20:22
16:25:23
17:01:52
17:13:07
17:20:19
17:25:55
第二个处理程序:

16:20:26
16:25:26
17:01:35
17:12:51
17:20:02
17:25:37
16:24:58
16:31:59
17:12:43
17:19:54
17:25:30
第三处理人:

16:20:26
16:25:26
17:01:35
17:12:51
17:20:02
17:25:37
16:24:58
16:31:59
17:12:43
17:19:54
17:25:30
所有处理程序都在单独的服务中运行。屏幕已关闭。 对于Android中的处理器,你有什么想法或替代方案吗

处理程序的代码非常简单:

handler.postDelayed(new Runnable() {
            public void run() {
            // network operations
            }
        }, interval);

首先,假设您通过
新处理程序()
创建了
处理程序
,它将在主应用程序线程上完成工作不要在主应用程序线程上执行网络I/O。这也可能是你漂移的根源

第二,您很可能不需要三种服务。通常,你需要一种服务。三项服务只会让你的应用程序更加复杂,对用户没有任何附加价值

第三,您的
处理程序只能在设备处于唤醒状态时工作,我不知道这是否是一个可接受的限制

第四,使用
处理程序
意味着您的服务将无限期地运行,用户不喜欢这样只有当您的服务积极地向用户提供价值时,才将其存储在内存中

因此,更好的实现方法是对计划的事件使用
AlarmManager
。如果设备处于休眠状态时不需要处理事件,则
AlarmManager
可以直接将控制权传递给您的服务。理想情况下,这将是一个
IntentService
,这样该服务将自动为您提供一个后台线程,并且当工作完成时该服务将自动关闭


如果您需要在设备处于睡眠状态时处理事件,请让用户控制事件期间,包括“不要做任何事情”选项,因为每5分钟唤醒设备进行网络I/O将对电池有害。然后,使用或来安排您的工作,同时保持设备处于唤醒状态。

使用
scheduledthreadpoolexecutor
而不是handler。
它有
scheduleAtFixedRate
函数,它完全满足您的需要。而且根本没有处理程序)

1。网络线程未在主线程中运行。这会使应用程序崩溃。2.我需要三个处理程序,因为它们不在同一时间间隔内运行。3.谢谢你提供的信息。我将试用AlarmManager。@JavaForAndroid:“2.我需要三个处理程序,因为它们不是在同一时间间隔内运行的。”--根据您的问题,它们不是在同一时间间隔(5分钟)内运行的。时间间隔是相同的。但有一点不同(5000毫秒),因为应用程序使用了设备的一些功能。顺便问一句:你觉得停机时间怎么样?这似乎是另一种选择。@JavaForAndroid:
CountDownTimer
在内部使用
处理程序,并且该处理程序绑定到主应用程序线程,因此它会遇到我在回答中概述的所有问题。AlarmManager工作正常。非常感谢。特别是您的解释。这仍然要求服务无限期运行,这是不现实的。它也没有解决在设备处于休眠状态时需要完成这项工作的任何潜在问题。