处理程序在Android中无法可靠地运行

时间:2013-09-04 15:29:32

标签: android service handler

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

First Handler:

16:20:22
16:25:23
17:01:52
17:13:07
17:20:19
17:25:55

Second Handler:

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有任何想法或替代方案吗?

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

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

2 个答案:

答案 0 :(得分:1)

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

其次,您很可能不需要三项服务。通常,您需要一项服务。三项服务只会使您的应用程序变得更加复杂,对用户没有任何附加价值。

第三,您的Handler仅在设备清醒时才有效,我不知道这是否是可接受的限制。

第四,使用Handler意味着您的服务将无限期运行,用户不喜欢这样。 只有当您的服务积极为用户提供价值时,才能将您的服务留在内存中

因此,实现此目的的更好方法是使用AlarmManager作为预定事件。如果您在设备处于睡眠状态时不需要处理事件,AlarmManager可以直接将控制权传递给您的服务。理想情况下,这将是IntentService,因此服务将自动为您提供后台线程,以便在工作完成时服务将自动关闭。

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

答案 1 :(得分:0)

使用SheduledThreadPoolExecutor代替处理程序。 它具有scheduleAtFixedRate功能,可以完全满足您的需求。并且根本没有处理程序)