后台工作 - 服务,线程或两者

时间:2011-06-20 08:23:53

标签: android multithreading service background handler

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

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

编辑:

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

似乎为每张图片制作一张新的图片会有点无意义。我正在尝试修改它以允许从多个活动进行访问。我也想使用正确的结构。从阅读开始,似乎Looper和Handler就是为此设计的。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

这取决于您希望流程的“背景”。如果您希望在用户不知道的情况下从网站获取数据,则应使用Service + AsyncTask(您仍然需要AsyncTask,因为默认情况下,{ {1}}在与UI相同的线程/进程中运行 - 所以如果你在没有单独线程的情况下执行任何长时间运行的任务,你将阻止UI线程并且它将非常讨厌。)

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

另一种方法是在AlarmManager中加载数据,同时向用户显示加载消息(您可能希望查看Activity)。通过这种方式,用户可以知道您正在做什么,并且您可以非常简单地实现“刷新”功能。

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

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

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

答案 2 :(得分:1)

您似乎有几个要求:

  1. 从互联网缓存适量的数据
  2. 在后台动态获取此数据
  3. 跨多个活动使用此数据
  4. 能够处理多个并发请求
  5. 如果您不想影响UI线程的性能,则第2点建议您需要一个单独的线程。第3点建议您需要服务。第1点和第4点表明某种队列可能有用。

    结合所有这些的一个类是IntentService。看看那个。它基本上在工作线程的后台排队和处理请求。由于它是所有互联网数据,您只需将其传递给带有URI的Intent,您就可以让IntentService为您进行下载。您可能希望传递ResultReceiver的意图,以便在下载完成时,您可以发信号通知您已完成该URI的活动。