gpt4 book ai didi

Android - 存储从网络下载的图像

转载 作者:可可西里 更新时间:2023-11-01 18:58:10 26 4
gpt4 key购买 nike

我有一个关于是否(以及如何)存储从网络加载的图像的问题。假设我正在从我的 Android 应用程序调用 Web 服务。在此 Web 服务中,我获得了 Web 上图像的 URL。我下载此图像并将其显示在 ListView 中列表项的左侧。我的问题是,我应该使用什么方法来存储图像?我应该:

  1. 将其保存到 SDCard,在创建 ListView 时检查它是否存在(在后续请求中)并在必要时重新下载(偶尔更新图像,以防它发生变化)。
  2. 使用 Context.getCacheDir() 将其存储在缓存中,但可能会被迫更频繁地重新下载它,因为我不能依赖保留在缓存中的图像。
  3. 总是下载它,从不存储图像。

图像文件本身相当小,但我希望一些用户可以下载/存储数十个这样的小图像。哪种方法效果最好,和/或首选方法是什么?

作为一个附带问题,我应该首先加载我的 ListView 中的所有图像(并可能锁定 UI 一段时间)还是异步加载它们但同时显示占位符图形(这可能有点“丑陋” “)?这里的标准是什么?

最佳答案

关于存储位置:答案取决于下载的内容和下载量。然后你做出选择。

例如:如果您正在下载临时的、数量较少(较少的远程提取)和大小(较少的内存)并且对于 Activity 来说是本地的东西,那么您应该考虑使用 SoftReferences 将图像保存在内存中。 SoftReferences 可能会导致重新获取,但由于项目数量很少,所以应该可以承受。

但是,如果要下载的项目数量超过某个阈值(意味着更多的提取和内存),您应该考虑通过缓存它们来减少提取和运行时内存消耗。在这里您可以选择将它们保存在 Sdcard 或临时存储(应用程序本地的缓存目录)上。对于小的并且仅在应用程序上下文中有意义的项目(例如缩略图),用户通常不会在您的应用程序之外使用它。所以,你可以把这些东西存放在缓存目录中。使用它们的最好的部分是您不必清理烂摊子。它是自动处理的。不过,这可能会导致重新获取。

但是,如果下载的项目很大并且可以独立于应用程序的上下文之外,例如图片、视频、音频剪辑,那么 SD 卡应该是您的选择。您还应该阅读:Handling large Bitmaps to avoid OOM error during BitmapFactory.decodeStream(..)

请注意,您还可以检查使用数据库是否可以提供帮助。 See this

在 ListView 中延迟加载项目时的一些注意事项:您应该在后台加载而不是阻塞 UI 线程。您应该考虑在下载项目时显示临时图像。这在许多 native 应用程序中很明显。延迟加载的示例实现 see this .此外,对于大型列表,您可以实现 SlowAdapter 模式(查看 API 演示)。它基本上会在列表滚动时停止下载。

可以在此处为您提供帮助的示例项目:

Romain Guy 的 Shelves 项目使用两级缓存,其中他使用内存缓存(包含 SoftReferences 的 HashMap)和存储在 Sdcard 上。 Browse Source code here

还有一些 Mark Murphy 编写的开源库 (CWAC) 和 DroidFu 可以提供帮助。

祝你好运!

关于Android - 存储从网络下载的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2054828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com