Bar*_*ara 14 storage android caching sd-card
我有一个问题是关于我是否应该(以及如何)存储从网络加载的图像.假设我从我的Android应用程序调用Web服务.在这个Web服务中,我获得了Web上图像的URL.我下载并在ListView中列表项的左侧显示此图像.我的问题是,我应该使用什么方法来存储图像?我是不是该:
图像文件本身相当小,但我希望一些用户可以下载/存储这些小图像.哪种方法效果最好,和/或什么是首选方法?
作为一个附带问题,我应该首先加载我的ListView中的所有图像(并且可能会锁定UI一段时间)或者异步加载它们,但同时显示占位符图形(可能更"丑陋")?这里的标准是什么?
Sam*_*muh 21
关于存储位置: 答案取决于下载的内容和数量.然后你做出选择.
例如:如果要下载的东西是暂时的,少的数量(少取遥控器)和大小(较少的内存),是当地的一个活动,那么你应该考虑使用SoftReferences保持图像在内存中.SoftReferences可以导致重新获取,但由于项目数量很少,因此应该可以负担得起.
然而,如果要下载的项目的数量超过一定的阈值(这意味着更多的取和内存),你应该考虑通过缓存它们减少取,也是运行时内存的消耗.在这里,您可以选择将它们保存在Sdcard上或临时存储(应用程序本地的缓存目录)上.对于小而且仅在应用程序的上下文中具有意义的项目(例如缩略图),用户通常不会在应用程序之外使用它.因此,您可以将这些内容存储在缓存目录中.使用它们最好的部分是你不必清理混乱.它会自动处理.但它可能导致重新获取.
但是,如果下载的项目很大并且可以独立于应用程序的上下文之外,例如图片,视频,音频剪辑,那么SD卡应该是您的选择.您还应该阅读: 处理大型位图以避免在BitmapFactory.decodeStream(..)期间出现OOM错误
请注意,您还可以检查使用数据库是否可以在此处提供帮助.看到这个
一些考虑而在ListView延迟加载项: 你应该做的加载在后台不阻塞UI thread.You应该考虑示出临时图像,而该项目正在下载.这在许多本机应用程序中很明显.有关延迟加载的示例实现,请参阅此内容.此外,对于大型列表,您可以实现SlowAdapter模式(检查API演示).当列表滚动时,它基本上会停止下载.
示例项目可以帮助您:
Romain Guy的Shelves项目使用两级缓存,其中他使用内存缓存(包含SoftReferences的HashMap)和Sdcard上的存储.在这里浏览源代码
还有一些开源库,Mark Murphy写的(CWAC)和DroidFu可以在这里提供帮助.
祝好运!