2014-10-05 119 views
0

我编写了一个Xamarin应用程序,并从网上检索图像并将它们加载到GridView中。我不希望每次都下载图片,而是希望加快这一过程。我收集我需要缓存图像。将图像缓存到磁盘

缓存基本上只是将图像保存到文件,并且当想要显示图像时,从文件而不是从网络中检索图像?

是下列正确的:

  1. 检查本地文件存在
  2. 检查本地文件具有网络文件
  3. 如果大小是不同的大小相同,获取和保存新文件从网上,然后加载新的文件
  4. 如果大小相同,加载本地保存的文件

是公关这么简单吗?有没有可以解释所有需要完成的设计模式或教程?

在此先感谢

+0

这就是它。不过,我会比较图片的日期,而不是大小(HTTP会很好地调整)。如果你想使它线程安全,还要注意同步。 – 2014-10-05 08:14:54

+0

我想用一些用户资源的异步加载代码。你有什么建议,我应该明确研究?我目前正在查看ImageLoader。 – user3736648 2014-10-05 09:23:31

+0

如果您正在谈论Android资源,您为什么不使用Android资源机制?如果不够流畅,请在任务中加载它以从资源加载图像,然后在UI线程中分配它。 – 2014-10-05 16:46:55

回答

1

为了有效的缓存图片,你从需要下载图像的服务器支持的协议,以帮助您缓存。其中一个用于Web缓存最普遍接受的标准协议是ETag

http://en.wikipedia.org/wiki/HTTP_ETag

下面是它如何工作的:

1)您请求http://someurl.com/image.jpg

2)服务器与响应的图像图像,并在响应标题中,会出现ETag的一些标识符的值:abc123

3)将图像保存到本地存储以及ETag值。

4)下一次您从同一个URL请求图片时,您会传递一个新标题; If-None-Match与ETag值保存ABC123

5)如果图像或内容没有改变,那么服务器会返回状态代码304 Not Modified回应,而你只是显示你在本地保存的图像。如果图像已更改,则服务器将响应状态码200和新的ETag值,并按照通常情况下替换缓存副本的方式下载图像。

+0

HTTP还具有额外的头文件,例如'Expires'和'Max-Age',允许客户端在一段时间内使用缓存的图像,而无需像上面的步骤4和5中的Mike概述那样执行条件获取。 – 2014-10-14 06:56:13