2011-06-20 24 views
2

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

我已阅读关于使用Handler和Looper。这些是否需要整合到服务中?或者我应该只用这些?

编辑:

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

看起来像为每个图像做一个新的这些将是有点没有意义。我试图修改它以允许从多个活动访问。我也想使用适当的结构。从阅读看来,似乎Looper和Handler是为此设计的。

+0

你说的缓存是什么意思?为什么不把它们放在静态地图中,并通过将信息写入外部存储器来备份?我们在谈论多少数据? – Kaj

+0

他们应该是非常小的图像主要。但他们来自网络并可能积累。 – SSMI

回答

1

你似乎有几个要求:

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

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

,结合所有这些是IntentService的一类。看看那个。它基本上排队并处理工作线程后台的请求。由于这是所有的互联网数据,你可以通过一个URI将它传递给一个意图,你可以让IntentService为你做下载。您可能想要传递一个ResultReceiver,以便在下载完成后,您可以发回已完成该URI的活动。

+0

这对我来说几乎是理想的,一般来说就是答案。然而,环顾四周之后,我决定使用Handler和Looper提供服务,这样我就可以控制优先级并获得更多的控制权。 – SSMI

+0

这当然是合理的。如果您看一下IntentService实现,它就是您所描述的:一个带有处理程序和循环的服务。 – kabuko

+0

它不允许您管理以何种顺序运行的任务。 – SSMI

1

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

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

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

1

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

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

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

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

  • 商店,你直接检索到缓存目录/ SD卡的文件(在Context退房getCacheDir()
  • 万一你解析(例如JSON/XML)你可以存储序列化对象的缓存目录/ SD卡,这样你就不必再解析他们
  • 您可以使用SQLite数据库(也有在Android开发人员网站的文档和教程)

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