所以我正在开发一个Android应用程序,它从网站获取数据作为其过程的一部分。一些数据是图像。我想缓存数据。我知道我需要在后台做这个,但我很困惑如何解决这个问题。我希望每个活动都可以访问背景部分。我想我需要将此功能放入后台运行的服务中。我是否还需要创建一个新线程,或者我可以在服务中隐式执行此操作吗?
我已阅读有关使用Handler和Looper的信息。这些是否需要集成到服务中?或者我应该使用那些?
编辑:
也许我不太清楚。我想从将在我的设备上显示的网页上获取数据。我找到了一个“懒惰列表”图像加载的例子看起来很有前景,但有一些缺点。它设置了一次下载一个图像的队列,然后更新列表视图。它只是一个线程。
似乎为每张图片制作一张新的图片会有点无意义。我正在尝试修改它以允许从多个活动进行访问。我也想使用正确的结构。从阅读开始,似乎Looper和Handler就是为此设计的。
答案 0 :(得分:1)
目前尚不清楚您的具体用例是什么。如果您想要预先加载一些图像,无论您的应用程序是否可见,您都应该考虑服务。
但是,如果您只想缓存当前活动中加载的图片,AsyncTask
可能是更好的选择。
在这两种情况下,您可能希望将缓存的图像存储在持久存储(缓存目录或SQLLite)中,因此它可用于您的任何活动。
答案 1 :(得分:1)
这取决于您希望流程的“背景”。如果您希望在用户不知道的情况下从网站获取数据,则应使用Service
+ AsyncTask
(您仍然需要AsyncTask
,因为默认情况下,{ {1}}在与UI相同的线程/进程中运行 - 所以如果你在没有单独线程的情况下执行任何长时间运行的任务,你将阻止UI线程并且它将非常讨厌。)
但是,这种方法会导致其他问题。例如,您必须找到一种方法来启动您的服务 - 使用Service
定期启动它,或者找一些其他机制(例如,监听广播意图)。
另一种方法是在AlarmManager
中加载数据,同时向用户显示加载消息(您可能希望查看Activity
)。通过这种方式,用户可以知道您正在做什么,并且您可以非常简单地实现“刷新”功能。
在这两种情况下,您都有相当多的存储选项。你可以:
ProgressDialog
上的getCacheDir()
)然后,您可以在任何应用程序组件(活动,服务等)中使用存储的数据
答案 2 :(得分:1)
您似乎有几个要求:
如果您不想影响UI线程的性能,则第2点建议您需要一个单独的线程。第3点建议您需要服务。第1点和第4点表明某种队列可能有用。
结合所有这些的一个类是IntentService
。看看那个。它基本上在工作线程的后台排队和处理请求。由于它是所有互联网数据,您只需将其传递给带有URI的Intent,您就可以让IntentService
为您进行下载。您可能希望传递ResultReceiver
的意图,以便在下载完成时,您可以发信号通知您已完成该URI的活动。