2015-01-09 38 views
2

我需要实现一个后台任务,需要每10秒更新一次UI。我尝试了以下方法,但其中大多数都失败了。Android - 高频后台任务

1)AlarmManager

我通过AlarmManager开始的意图的服务。看起来AlarmManager只适用于非常低的频率,比如几个小时。如果我将其设置为10秒,那么界面不再响应。这是为什么?意图服务不在单独的线程中运行吗?

2)IntentService用无限循环和的Thread.sleep

应用在约30秒后终止,UI是不响应的。意图服务仅用于非常短的后台任务吗?我发现与此相矛盾的信息。为什么UI没有响应,尽管意图服务应该在单独的线程中运行?

3)的AsyncTask

当使用的AsyncTask中,UI保持响应。但由于某些原因,没有其他AsyncTask从UI启动。我听说过并发AsyncTasks的一些限制,但2应该不会太多?

4)自己的线程

工作。后台服务和用户界面功能齐全。但是,我读到更新UI时直接使用线程是不好的做法。在这种情况下将数据发送到活动的最佳方式是什么?

对于需要更新UI并每10秒重新获得一次后台任务,您有什么建议?

此致敬礼!

+0

“如果我将它设置为10秒,那么UI不再响应,为什么?” - 因为你的代码中有一个错误。 “为什么用户界面没有响应,尽管意图服务应该在单独的线程中运行?“ - 因为你的代码中存在一个bug”我听说过一些并发AsyncTasks的限制,但是2应该不会太多?“ - ”AsyncTask“在Android 3.2+上被序列化,其targetSdkVersion为13或请参阅[AsyncTask'文档](http://developer.android.com/reference/android/os/AsyncTask.html)中的“执行顺序”。 – CommonsWare 2015-01-09 22:43:03

+0

“我读过使用线程是不好的做法直接更新UI“ - 从后台线程更新'View'通常会导致崩溃。假设你正在做一些事情来解决这个问题(例如'runOnUiThread()'),或者只更新那些是安全地在后台线程上更新(例如'ProgressBar')。“你有什么建议...” - 这取决于其他信息,比如当用户离开你的应用程序时会发生什么事情 – CommonsWare 2015-01-09 22:45:04

+0

@CommonsWare' CommonsWare'正在以非常特定的方式回答你的问题,我建议你现在问他:'为什么我有一个bug'当然提供代码:) – Mike 2015-01-09 22:45:05

回答

1

由于您需要以循环方式发生任务,因此我认为Alarm Manager是更好的选择。

这些是我的原因。

  1. 它允许您在设定的时间和/或时间间隔启动Intents。
  2. 我们可以结合使用它们与广播接收机启动服务和进行其他操作,甚至当你的应用程序没有运行,即使设备本身是睡着了
  3. 它们可以帮助您最大限度地减少应用程序的资源需求。 您可以安排操作而不依赖定时器或连续运行后台服务。

按照Android文档,

对于时序,保证您的应用程序的生命周期 期间发生的操作,而不是考虑使用与定时器及线程 结合的处理程序类。这种方法可以让Android更好地控制系统资源。