【问题标题】:Background Work - Service, Thread or Both后台工作 - 服务、线程或两者兼而有之
【发布时间】:2011-06-20 08:23:52
【问题描述】:

因此,我正在开发一个 Android 应用程序,该应用程序从网站获取数据作为其流程的一部分。其中一些数据是图像。我想缓存数据。我知道我需要在后台执行此操作,但对如何执行此操作感到困惑。我希望每个活动都可以访问背景部分。我想我需要将此功能放入后台运行的服务中。我是否还需要创建一个新线程,或者我可以在服务中隐含地这样做吗?

我已阅读有关使用 Handler 和 Looper 的信息。这些是否需要集成到服务中?还是我应该只使用那些?

编辑:

也许我不是很清楚。我想从将在我的设备上显示的网页中获取数据。我发现了一个看起来很有希望但有一些缺点的“惰性列表”图像加载示例。它设置了一个图像队列,一次下载一个,然后更新列表视图。虽然它只是一个线程。

似乎为每张图片制作一个新的这些似乎有点毫无意义。我正在尝试对其进行修改以允许从多个活动进行访问。我也想使用正确的构造。从阅读来看,Looper 和 Handler 似乎就是为此而设计的。

【问题讨论】:

  • 缓存是什么意思?为什么不把它们放在静态地图中,然后通过将信息写入外部存储来备份呢?我们在谈论多少数据?
  • 它们应该主要是非常小的图像。但它们来自网络,可能会累积。

标签: android multithreading service background handler


【解决方案1】:

您似乎有几个要求:

  1. 从互联网缓存适量的数据
  2. 在后台动态获取这些数据
  3. 在多个活动中使用此数据
  4. 能够处理多个并发请求

如果您不想影响 UI 线程的性能,第 2 点建议您需要一个单独的线程。第 3 点建议您需要一项服务。第 1 点和第 4 点表明某种队列可能有用。

结合所有这些的一类是IntentService。看看那个。它基本上在工作线程的后台排队和处理请求。因为它都是互联网数据,你可以通过一个带有 URI 的 Intent 传递给它,你可以让IntentService 为你下载。您可能希望传入 ResultReceiver 的意图,以便在下载完成时,您可以向 Activity 发出信号,告知您已完成该 URI。

【讨论】:

  • 这对我来说几乎是理想的,总的来说就是答案。然而,环顾四周后,我决定使用带有 Handler 和 Looper 的服务,这样我就可以控制优先级并获得更多控制权。
  • 这当然是合理的。如果您查看 IntentService 实现,它正是您所概述的:具有处理程序和循环器的服务。
  • 它不允许你管理哪些任务以什么顺序运行。
  • 是的,我只是同意,如果您有更多 IntentService 无法处理的要求,那么自己实现它是合理的。
【解决方案2】:

尚不清楚您的具体用例是什么。如果您想预先加载一些图像以使其可用,无论您的应用程序是否可见,您都应该考虑服务。

但是,如果您只想缓存当前活动中加载的图像,AsyncTask可能是更好的选择。

在这两种情况下,您可能都希望将缓存的图像存储在持久存储(缓存目录或 SQLLite)中,以便您的任何活动都可以使用它。

【讨论】:

    【解决方案3】:

    这取决于您希望该过程的“背景”程度。如果您想在用户不知道的情况下从网站获取数据,您应该使用Service + AsyncTask(您仍然需要AsyncTask,因为默认情况下,Service 在与 UI 相同的线程/进程 - 因此,如果您在没有单独线程的情况下执行任何长时间运行的任务,您将阻塞 UI 线程,这将非常讨厌)。

    但是,这种方法会导致其他问题。例如,您必须找到一种方法来启动您的服务——要么使用AlarmManager 定期启动它,要么找到一些其他机制(例如,监听广播意图)。

    另一种方法是在Activity 中加载数据,同时向用户显示加载消息(您可能需要查看ProgressDialog)。这样用户就知道您在做什么,您可以非常简单地实现“刷新”功能。

    在这两种情况下,您都有很多存储选项。你可以:

    • 将您检索到的文件直接存储到缓存目录/sdcard(在Context 上查看getCacheDir()
    • 如果您进行解析(例如 JSON / XML),您可以将序列化的对象存储到缓存目录 / sdcard,这样您就不必再次解析它们了
    • 您可以使用 sqlite 数据库(android 开发网站上有文档和教程)

    然后,您可以在任何应用程序组件(活动、服务等)中使用存储的数据

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2015-10-14
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多