跨API的TimerTask和AsyncTask实现

时间:2013-03-25 11:21:30

标签: android android-asynctask timertask

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

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

以上所有这些在Android API 16和17上运行良好,但在标准为“无法创建处理程序... Looper.prepare()”错误的低级API上失败,如此处所述{{3} }

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

谢谢,

Veljko

2 个答案:

答案 0 :(得分:0)

我建议使用Alarm Service来安排操作,并使用Intent Service来完成它们。由于您不需要触摸UI,因此更容易。

答案 1 :(得分:0)

问题可能是您没有在UI线程中创建第一个AsyncTask,这将影响随后创建的所有AsyncTasks。看看这个问题 - 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