【问题标题】:Android - High frequency background taskAndroid - 高频后台任务
【发布时间】: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 或更高。请参阅the AsyncTask docs 中的“执行顺序”。
  • “我了解到在更新 UI 时直接使用线程是不好的做法”——从后台线程更新 View 通常会导致崩溃。据推测,您正在做一些事情来解决这个问题(例如,runOnUiThread()),或者只更新可以在后台线程上安全更新的小部件(例如,ProgressBar)。 “你有什么推荐...”——这取决于其他信息,例如当用户离开你的应用时应该发生什么。
  • @CommonsWare CommonsWare 正在以非常具体的方式回答您的问题。我建议你现在就问他:Why do i have a bug,当然还要提供代码:)
  • @Mike:我无法告诉 OP 为什么 OP 在代码中有错误,因为我看不到 OP 的代码。在 Java 中搞砸线程间通信的方法有很多种,更不用说 Android 的主应用程序线程了。
  • @CommonsWare 我知道,它不应该令人反感。我真的很喜欢你回答问题的方式。如果有人问你正确的问题,他会得到非常好的信息。

标签: android multithreading background task


【解决方案1】:

由于您需要以重复的方式执行任务,我认为警报管理器是更好的选择。

这些都是我的理由。

  1. 它允许您以设定的时间和/或间隔触发 Intent。
  2. 我们可以将它们与广播接收器结合使用,以启动服务并执行其他操作,即使您的应用未运行,即使设备本身处于休眠状态
  3. 它们可以帮助您最大限度地减少应用程序的资源需求。 您可以在不依赖计时器或持续运行后台服务的情况下安排操作。

根据安卓文档,

用于保证在生命周期内发生的定时操作 您的应用程序,而是考虑使用 Handler 类 结合定时器和线程。这种方法让Android更好 控制系统资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多