2014-12-31 2 views
1


Я разрабатываю приложение 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; 
    } 
} 

ответ

2

Ну я задал аналогичный вопрос по поводу того, как работать с загрузкой данных кэширования и выполнением их параллельно. Посмотрите здесь ответ: Task caching when performing Tasks in parallel with WhenAll

Итак, ваш GetImage должен идти в списке, который содержит задачи вместо результата.

+0

Спасибо, он отлично работает! Все изображения загружаются только один раз. У вас есть идея сохранить загруженные изображения во время работы приложения? – Speederer

+0

Хорошо, извините! Я уже знаю. :) Изображения будут сохранены в ConcurrentDictionary. – Speederer

+0

Вы можете разгрузить их на диск, если это необходимо ... зависит от того, как часто они меняются. Например, если это всегда одни и те же изображения, день за днем, чем хранить их на диске и проверять, что сначала перед удалением веб-url – Depechie