来自HttpClient响应的图像缓存

时间:2014-12-31 10:04:04

标签: image listview caching windows-runtime windows-phone-8.1


我正在开发一个包含ListView的WP 8.1应用程序。在每个ListView项目中都有一些文本和图片。这些图片来自Http GET请求,我必须绑定到xaml。我之前有一个解决方案,但我有一些性能问题。 ListView可以多次包含相同的图片,因此同一图片也会多次调用GetImage任务。在WiFi连接上,这不是一个大问题,但连接不良则是 我想要实现的另一件事是图像缓存。在应用运行时,我不知道哪里是存储图片的最佳位置。我应该存储大约10-40张图片,图像大小在3到20 KB之间。由于关闭应用程序后不需要这些图像,我想我可以将它们存储在内存中,而不是存储文件夹中 所以,我想要的是:一次下载每个图像并在应用程序运行时存储它们。

以下是我用来下载图片的代码:

public class WebPathToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value == null) return null;
            return new TaskCompletionNotifier<BitmapImage>(GetImage((string)value));
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        { throw new NotImplementedException(); }

        private async Task<BitmapImage> GetImage(string emailaddress)
        {
            ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
            Uri uri = new Uri((string)localSettings.Values["Server"] + "Image/Downloadavatar?EmailAddress=" + emailaddress + "&Size=NORMAL");

            HttpClient webCLient = new HttpClient();
            IInputStream responseStream = await webCLient.GetInputStreamAsync(uri);
            MemoryStream memoryStream = new MemoryStream();
            Stream stream = responseStream.AsStreamForRead();
            await stream.CopyToAsync(memoryStream);
            memoryStream.Position = 0;
            BitmapImage bitmap = new BitmapImage();
            await bitmap.SetSourceAsync(memoryStream.AsRandomAccessStream());
            return bitmap;
    }
}

1 个答案:

答案 0 :(得分:2)

我问了一个关于如何使用缓存数据下载并同时执行它们的类似问题。 看看这里的答案:Task caching when performing Tasks in parallel with WhenAll

因此,简而言之,您的GetImage应该放在一个包含任务而不是结果的列表中。