2016-03-20 2 views
1

Справочная информация:WP8.1 RT: Databinding (удаленные) изображения замедлиться App

Я работаю на WP8.1/WP10 мобильное приложение, которое работает с локальным устройством у меня здесь. Это локальное устройство обслуживает json и изображения через ASP.NET Web APi. Мое приложение делает веб-звонки для получения информации и отображения информации для пользователя. Довольно простая настройка.

Мой процесс работает следующим образом: пользователь запускает приложение. Приложение находит «webservice» в сети с UPNP. Когда это произойдет, он обменяет токен, и мы можем начать звонить в веб-службу. Я хватаю список объектов, которые содержат заголовок, субтитры и изображение. Изображения URI, как:

192.168.1.x:8080/getImage/?uri=someremoteimageurihere. 

Мое устройство загрузит эти изображения и вернуть их в приложение (мне нужно работать таким образом для некоторых других целей это устройство имеет).

Чтобы сохранить жидкость UI, я использую виртуализацию в списке, который я показываю, и пользователь может прокручивать список без какого-либо задержек. Все идет нормально. Существует только один вопрос:

Мой вопрос

Моя проблема с изображениями в моем шаблоне ListView. Хотя пользовательский интерфейс является отзывчивым, телефон постоянно загружает изображения, особенно когда пользователь прокручивает из пункта № 300 в пункт №1. Вы увидите, что он загружает изображения один за другим с # 299 вплоть до # 1. Проблема в том, что пользователь просматривает # 1 в списке, и для всех загружаемых изображений потребуется около минуты, это от # 299 до # 1.

Мне интересно, как я могу получить больше контроля над загрузкой этих изображений. Хотя при загрузке этих изображений у моего приложения мало времени для «других» задач, например. все остальные вызовы в веб-api, похоже, ждут загрузки изображений на экране (это без блокировки нити u!). Поэтому в основном, если я перейду к выходу настроек, настройки будут загружаться только после загрузки партии изображений.

Есть ли способ загрузить эти изображения на одном фоне? Задержка для конечного пользователя приемлема, если привязка изображений не получает приоритет над любыми другими изображениями.

Этот вопрос не о:

  • Заперев потока пользовательского интерфейса при выполнении работы
  • Помощь по связыванию данных
  • Кэширование стратегии

Спасибо за ваши идеи!

+0

ли вы WebAPI служить изображения размером телефон должен отображать их, или это изменение размера их? Изменение размера происходит медленно. –

+0

Нет, это не так, и у меня нет способа сделать это (эта часть является третьей стороной). Так что да, все изображения изменяются «на лету», что не помогает. –

ответ

0

Вы можете попробовать связать непосредственно со своими загруженными изображениями (как с ресурсом ImageSource), а не с использованием сервера Uri: поэтому у вас есть все необходимое для загрузки этих изображений в ваш собственный код в фоновом режиме и их доступности в вашей ViewModel в виде коллекции изображений.

Вы можете попробовать этот код:

public async void GetImage(Uri url) 
{ 
    HttpClient client = new HttpClient(); 
    HttpResponseMessage response = await client.GetAsync(url); 
    byte[] img = response.Content.ReadAsByteArray(); 
    InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream(); 

    DataWriter writer = new DataWriter(stream.GetOutputStreamAt(0)); 
    writer.WriteBytes(img); 

    await writer.StoreAsync(); 

    BitmapImage bi = new BitmapImage(); 
    bi.SetSource(randomAccessStream); 

    image1.Source = bi; 
} 

Пожалуйста, отметьте, как ответил, если это помогает :)

+0

Я пробовал это, но это не решение моей проблемы. Проблема заключается в том, что если вы перейдете от # 1 в списке до # 300, она будет загружать каждое изображение с 1-300, а мне нужно только загрузить их на экран. Ваш метод «getimage» - это еще один способ установки источника изображения, который не является моей реальной проблемой :). –

+0

Какую виртуализацию вы используете для своего списка? Инкрементальный или произвольный доступ? –

1

ли функция фазирования исправить вы выдаете? Phasing - это функция {x: Bind}, которая работает с элементами управления, полученными из ListViewBase, и которая постепенно обрабатывает шаблон элемента для привязки данных. При отображении элементов списка ListViewBase отображает одну фазу для всех элементов в представлении перед переходом на следующую фазу. Работа рендеринга выполняется в пакетах с временным разделением, так что при прокрутке списка требуемая работа может быть переоценена и не выполнена для элементов, которые больше не видны. https://msdn.microsoft.com/en-us/windows/uwp/xaml-platform/x-phase-attribute

1

Вы должны попробовать случайную виртуализацию данных для доступа к данным на вашем ListView:

Случайная виртуализация доступа к данным позволяет загружать из любой точки в наборе данных. ListView, который использует виртуализацию данных произвольного доступа, используемый для просмотра коллекции из миллиона элементов, может загружать элементы 100 000 - 100 050. Если пользователь переместится в начало списка, элемент управления загружает элементы 1 - 50. В любом случае большой палец полосы прокрутки указывает, что ListView содержит миллион элементов. Положение большого пальца полосы прокрутки относительно того, где видимые элементы находятся во всем наборе данных коллекции. Такой тип виртуализации данных может значительно сократить требования к памяти и время загрузки для коллекции. Чтобы включить его, вам нужно написать класс источника данных, который извлекает данные по запросу и управляет локальным кешем и реализует эти интерфейсы.

https://msdn.microsoft.com/en-us/windows/uwp/debug-test-perf/listview-and-gridview-data-optimization#random-access-data-virtualization

+0

Не могли бы вы отметить, как решили? –

Смежные вопросы