Я разрабатываю приложение WP 8.1, которое содержит ListView. В каждом элементе ListView есть текст и изображение. Изображения поступают из запроса Http GET, который я должен привязать к xaml. У меня есть решение для этого раньше, но у меня есть некоторые проблемы с производительностью. ListView может содержать одно и то же изображение несколько раз, поэтому задача GetImage вызывается несколько раз для того же изображения. На Wi-Fi-соединении это не большая проблема, но с плохим подключением.
Другое, что я хотел бы реализовать, это кэширование изображений. Я не знаю, где лучше всего хранить фотографии во время работы приложения. Я должен хранить приблизительно 10-40 штук изображений, а размеры изображения составляют от 3 до 20 КБ. Из-за этих изображений нет необходимости после закрытия приложения, я думаю, что я могу сохранить их в памяти, а не в папке с хранилищем.
Итак, что я хочу: скачайте сразу все изображения и сохраните их во время работы приложения.Кэширование изображений из ответа HttpClient
Вот код, что я использую для загрузки изображений:
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;
}
}
Спасибо, он отлично работает! Все изображения загружаются только один раз. У вас есть идея сохранить загруженные изображения во время работы приложения? – Speederer
Хорошо, извините! Я уже знаю. :) Изображения будут сохранены в ConcurrentDictionary. – Speederer
Вы можете разгрузить их на диск, если это необходимо ... зависит от того, как часто они меняются. Например, если это всегда одни и те же изображения, день за днем, чем хранить их на диске и проверять, что сначала перед удалением веб-url – Depechie