防止从azure-windows手机下载已下载的图像

时间:2014-01-10 08:28:36

标签: c# image windows-phone-7 azure windows-phone-8

我有一个返回azure URL的Web服务,我将其设置为列表项模板中我的图像控件的数据源。此列表可能包含大量项目(现在它只有大约30个项目)。我的应用程序此单页的内存消耗超过100 MB,下载了大约10 MB的数据。

当用户访问其他页面并使用azure中的图像返回此页面时,将再次调用我的Web服务,因此将再次下载所有图像。是否有任何方法可以检查图像是否已下载和阻止再次下载?

我不确定在为图像控件提供URL时会发生什么。

这是我的XAML

<Image 
   Stretch="UniformToFill" 
   Grid.Column="1" 
   Grid.Row="0" 
   VerticalAlignment="Top" 
   Source="{Binding image_name}" 
   Height="72" 
   Width="128" >
</Image>

3 个答案:

答案 0 :(得分:2)

BitmapImage可以检查缓存中是否存在现有副本。当然,如果您没有设置忽略缓存的选项。检查此documentation page。此外,它可能是您的Azure存储中的标头问题,请确保允许缓存并且对象生存时间足够。

答案 1 :(得分:2)

这就是我将如何解决问题。创建所有图像的XML目录。在XML中有一个唯一的指纹标识符,应该从Image生成。在第一次加载图像时,您将首先从服务器获取此XML并将其保存在Windows Phone的独立存储中。然后,当用户从一个项目到另一个项目时,从服务器下载该特定图像并将其保存在Windows Phone的隔离存储中。

现在有趣的问题,如果在服务器上添加新图像或更新现有图像怎么办?在这种情况下,服务器上的目录也需要更改(使用新信息进行更新。因此,下次WP应用程序启动时,它将获取新目录并检查所有指纹,未找到或发现指纹未更改,WP app将仅按需下载这些图像(我的意思是当用户仅导航到该项目时)。

因此,主要概念是将此XML目录作为所有图像的版本配置文件。另请注意,保持此XML文件的大小简单。 HTH。

答案 2 :(得分:1)

首先 - 你不应该从服务器下载所有全尺寸的iamges - 对于移动应用程序来说10 MB是很多。您应该使用一些缩略图,然后当用户请求您下载完整版本时。

如果您可以将缓存作为临时解决方案,那么这可能是最简单的方法。 如果您想将图像存储在手机中较长时间(您也可以控制),则必须在此处实现自己的逻辑。最简单的方法可能是维护已下载的所有图像的字典,并创建一个ValueConverter,它将检查boud URL并返回本地URL(如果图像存在或启动后台下载),这将引发PropertyChanged事件以显示绑定属性完成后的图像。