【发布时间】:2015-01-09 22:32:46
【问题描述】:
我需要实现一个后台任务,该任务需要大约每 10 秒更新一次 UI。我尝试了以下方法,但大多数都失败了。
1) 报警管理器
我通过 AlarmManager 启动了一个意图服务。似乎 AlarmManager 只适用于非常低的频率,比如几个小时。如果我将其设置为 10 秒,那么 UI 将不再响应。这是为什么?意图服务不是在单独的线程中运行吗?
2) IntentService 带有无限循环和 Thread.sleep
应用程序在大约 30 秒后终止,UI 完全没有响应。意图服务是否仅适用于非常短的后台任务?我发现了与此相关的相互矛盾的信息。为什么意图服务应该在单独的线程中运行,但 UI 没有响应?
3) 异步任务
使用 AsyncTask 时,UI 保持响应状态。但由于某些原因,没有从 UI 启动其他 AsyncTask。听说并发 AsyncTask 有一些限制,但是 2 应该不会太多吧?
4) 自己的线程
那行得通。后台服务和 UI 功能齐全。但是,我读到在更新 UI 时直接使用线程是不好的做法。在这种情况下,将数据发送到 Activity 的最佳方式是什么?
对于需要更新 UI 并且大约每 10 秒重新出现一次的后台任务,您有什么建议?
最好的问候!
【问题讨论】:
-
"如果我将其设置为 10 秒,那么 UI 将不再响应。这是为什么呢?" - 因为你的代码中有一个错误。 “虽然意图服务应该在单独的线程中运行,但为什么 UI 没有响应?” - 因为你的代码中有一个错误。 “听说并发 AsyncTasks 有一些限制,但是 2 应该不会太多吧?” --
AsyncTask在 Android 3.2+ 上序列化,targetSdkVersion为 13 或更高。请参阅theAsyncTaskdocs 中的“执行顺序”。 -
“我了解到在更新 UI 时直接使用线程是不好的做法”——从后台线程更新
View通常会导致崩溃。据推测,您正在做一些事情来解决这个问题(例如,runOnUiThread()),或者只更新可以在后台线程上安全更新的小部件(例如,ProgressBar)。 “你有什么推荐...”——这取决于其他信息,例如当用户离开你的应用时应该发生什么。 -
@CommonsWare
CommonsWare正在以非常具体的方式回答您的问题。我建议你现在就问他:Why do i have a bug,当然还要提供代码:) -
@Mike:我无法告诉 OP 为什么 OP 在代码中有错误,因为我看不到 OP 的代码。在 Java 中搞砸线程间通信的方法有很多种,更不用说 Android 的主应用程序线程了。
-
@CommonsWare 我知道,它不应该令人反感。我真的很喜欢你回答问题的方式。如果有人问你正确的问题,他会得到非常好的信息。
标签: android multithreading background task