0

我发现 AsyncTask 和 TimerTask 在不同的 API 版本中表现不同。

这是我的设置: TimerTask 设置为每隔一段时间触发一次。有一个服务,它的方法在 TimerTask 触发时被调用。该方法为一些后台处理实例化一个 AsyncTask。请注意,AsyncTask 不会触及 UI。

以上所有方法在 Android API 16 和 17 上都可以正常工作,但在较低级别的 API 上会失败,并出现标准的“无法创建处理程序... Looper.prepare()”错误,例如在此处说明Start AsyncTask in TimerTask

我通过将我的 AsyncTask 更改为 Runnable,然后在服务的方法中手动启动一个新线程来解决这个问题。但是,我想知道自 16 版以来 API 发生了什么变化?Looper.prepare() 现在实际上是在 TimerTask 线程中调用的吗?如果是这样,是否有一种简单的方法可以在我的代码中实现相同的东西,以便我可以继续使用 TimerTask(Runnable 解决方案在很多方面都不是最佳的,因为我可能会决定稍后从 AsyncTask 更新 UI)。

谢谢,

韦利科

4

2 回答 2

0

问题可能是您没有AsyncTask在 UI 线程中创建第一个,这将影响随后创建的所有 AsyncTask。看看这个问题 - onPostExecute not being called in AsyncTask (Handler runtime exception)

解决方法是从 Application 类加载 AsyncTask。

较低级别 API 上的 AsyncTask 行为也有所不同。异步任务真正在较低级别的 API 中同时运行,而不是在较高级别的 API 中一次运行一个任务。这可能是一个促成因素。

仅当您需要进行 UI 更新时才需要 Async 任务。这就是类的前/后操作的目的。如果没有 UI 更新,使用 Runnable 是完全可以的。只需确保 Runnables 在完成处理后不会闲逛。

您可以使用@Atrix1987 建议的警报,但我只在调度时间超过 15 分钟时使用它们(这对您来说可能仍然适用)。我已经在另一个问题中解释了原因 - Scheduling recurring task in Android

于 2013-03-25T11:40:38.253 回答
0

我建议使用警报服务来安排动作,并使用意图服务来完成它们。由于您不需要触摸 UI,它使事情变得更容易。

于 2013-03-25T11:29:44.827 回答