【问题标题】:Android best way of caching imagesAndroid缓存图像的最佳方式
【发布时间】:2013-10-17 12:53:29
【问题描述】:

我正在尝试为我的应用程序构建缓存从网络下载的图像的最有效方法,几年前我尝试这样做,但直到我偶然发现在这里找到惰性列表适配器:

Lazy load of images in ListView

这在引入 android 4.0 之前运行良好,此时应用程序会在加载 10 到 20 张图像后崩溃,而不是之前我可以简单地加载任意数量的图像而没有任何问题,后来我发现了是冰淇淋三明治对每个应用程序的内存使用设置了限制的结果,这在 Gingerbread 2.3 及以下版本中不存在,我最终决定每隔 10 左右的图像清除一次缓存以避免崩溃,但是用户体验不是这样做的结果非常好,并且该应用程序使用了大量数据,因为它不断地一遍又一遍地重新下载已经查看过的图像,此后我尝试使用 lru 缓存,但这似乎根本不起作用,特别是当我离开应用程序并重新启动它时,似乎所有图像都已发布,我需要一种更好的方法来做到这一点,我注意到其他应用程序(如 instagram)似乎已经找到了一种缓存数百兆图像的方法,我始终必须手动清除我的设置中的 instagram 缓存,因为它们似乎能够存储无限大小的缓存,似乎永远不会弹出其内容,有人知道如何构建这种缓存吗?

【问题讨论】:

  • “我后来发现这是冰淇淋三明治对每个应用程序的内存使用设置限制的结果,这在 Gingerbread 2.3 及以下版本中不存在”——是的,确实如此。跨度>
  • 如果是这种情况,为什么当我的手机从 2.3 更新到 40 时,我突然无法在该缓存中存储许多图像?
  • 我无从得知。您显然也没有,因为您似乎没有使用 DDMS 和 MAT 来确定内存问题的根源。但是,您关于内存使用的说法完全不正确。自 Android 1.0 以来,Android 就有堆大小限制。根据屏幕分辨率和操作系统版本,它们从最初的 16MB 限制增加。

标签: android caching android-lru-cache diskcache


【解决方案1】:

您可以尝试使用https://github.com/nostra13/Android-Universal-Image-Loader 图书馆。这为您完成了大部分艰苦的工作。

【讨论】:

  • 哇这个库看起来棒极了,明天有时间我会尝试使用它,如果它和我认为的一样好用,我会尝试向编写它的开发人员捐款!
【解决方案2】:

我建议的方法是将图像从网络存储到 sdcard 或其他东西,然后存储法师所在的 URI。列表中的 只是从 uri 加载图像。

如果您的图像尺寸很大,您可能应该在保存图像之前调整图像大小,以便使用更少的内存并且加载速度更快,因为处理已经完成

顺便说一句,内存限制在android中一直存在

【讨论】:

  • 我会尝试这样做,但是我不知道还有什么可以解释为什么我的应用程序在操作系统更改时开始崩溃,在 2.3 中我加载了非常大的图像并且它永远不会导致问题,在 4.0我开始不停地出现 OutOfMemoryError
  • 您可能会遇到错误,因为您没有正确缩放图像
  • 之后我开始将图像缩放得更小,但问题是图像质量很糟糕,这违背了应用程序的目的,另一方面,instagram 能够加载巨大的图像和很多无论如何,它们都保留在缓存中
猜你喜欢
  • 2012-06-19
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2010-10-05
  • 2014-10-19
相关资源
最近更新 更多