Xamarin.Forms — кэширование страниц

Я создаю приложение с помощью Xamarin.Forms, и у меня есть "страница галереи". Эта страница состоит из множества изображений, которые загружаются на страницу.

Загрузка изображений занимает довольно много времени, а при переходе на другую страницу и последующем возврате с помощью Navigation.PopAsync и Navigation.PushAsync всю страницу необходимо заново перестраивать (фотографии загружаются снова и снова).

Я пытался кэшировать страницу (поэтому не выполнял Navigation.PushAsync(new GalleryPage()) все время, но сохранял ее в переменной, но это не имеет значения.

Кто-нибудь знает, как кэшировать всю страницу, чтобы ее не нужно было загружать заново?

Спасибо


person Maarten    schedule 19.05.2015    source источник


Ответы (2)


Если вы сохраняете объект страницы в переменной, поэтому вы делаете

Page myPage = new Page();
Navigation.PushAsync(myPage);

затем позже сделать

Navigation.PushAsync(myPage);

это, безусловно, должно держать страницу загруженной в памяти.

Изображения, как правило, также кэшируются. Поэтому, если вы получаете их по URL-адресу, они будут кэшироваться.

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

person Adam    schedule 19.05.2015
comment
Я пробовал, изображения загружаются из файловой системы. Однако, когда страница помещается обратно в стек, возникает длительная задержка перед отображением страницы. (Он полностью рисует страницу перед отображением, получая много сообщений, таких как [Хореограф] Пропущено 486 кадров! Приложение может выполнять слишком много работы в своем основном потоке.). В методе OnAppearing нет кода. - person Maarten; 19.05.2015
comment
Мне нужно увидеть ваш код, чтобы дать вам больше указаний. Похоже, вы перегружаете поток пользовательского интерфейса, и это также может быть проблемой эмулятора. Как ваш код работает на реальном Android-устройстве? - person Adam; 19.05.2015
comment
Если вы хотите показать код представления, мы сможем дать вам больше указаний, чтобы узнать, есть ли у вас Grid, ListView, StackLayout и т. д. - person Adam; 20.05.2015

Проблема, вероятно, заключается в размере и количестве изображений, которые вы показываете.

Я решил ту же проблему в два этапа:

  • Создавайте миниатюры — большие изображения загружаются намного дольше, и если вы их много на экране они все маленькие. Возможно, стоит уменьшить их масштаб по мере их поступления и сохранить миниатюру. Изображение с камеры может весить 5–8 МБ, а миниатюра — 20–30 КБ. Большое изображение также придется уменьшать каждый раз, когда вы его показываете.

  • Используйте ListView для отображения изображений, а не Grid, StackLayout или что-то еще, что у вас может быть. Разница в том, что ListView рендерится более динамично, он создает строки только тогда, когда они собираются отображаться, поэтому не все изображения загружаются в память. В качестве альтернативы вы можете создать собственную логику, которая динамически загружает и выгружает изображения. Худший случай, на который стоит обратить внимание, — это использование прокрутки, заполненной изображениями — они, скорее всего, попытаются отобразиться, даже если они находятся за пределами экрана.

person Sten Petrov    schedule 19.05.2015
comment
Спасибо за вашу реакцию, мы уже используем миниатюры, но не используем список. Я попробую и вернусь как можно скорее. - person Maarten; 20.05.2015
comment
Я только что проверил кое-что о Listviews и у меня есть вопрос. Мы пытаемся создать галерею, подобную этому примеру (sapegin.github.io/jquery.mosaicflow). Просто изображения разного размера. Возможно ли это со списком, потому что нет столбцов? - person Maarten; 20.05.2015
comment
Я не думаю, что вы можете сделать это в виде списка разумным образом. Вы можете внедрить собственное решение и создать для него пользовательский рендеринг (более высокая производительность, больше кода) или создать его из стандартных представлений XF (более низкая производительность, более простая работа). - person Sten Petrov; 20.05.2015
comment
Суть, однако, остается прежней: иметь только элементы пользовательского интерфейса, соответствующие изображениям, которые хотя бы частично видны или должны быть видны, и отбрасывать те, которые не видны. - person Sten Petrov; 20.05.2015
comment
Разве scrollview не должен делать это за вас? - person Maarten; 21.05.2015
comment
Нет, scrollview не виртуализирует - person Sten Petrov; 21.05.2015