TransWikia.com

Image в listView

Stack Overflow на русском Asked on December 30, 2021

я создаю программу наподобиe контактов, есть два активити главное где я вывожу лист прочитан из базы данных (имя человека, номер и фотография) и есть второе Активити в котором загружают фото из галереи, и его uri записываю в базу данных соответствующем контакта, и вот когда я вывожу это все в листе в главном меню у меня крашит программу из-за нехватки памяти я понял это все из фотографий? как мне оптимизировать эту работу с фотографиями, как выводить их правильно из базы данных в listView ???

One Answer

Одного Picasso вам не хватит. Он позволяет не париться с кэшированием, но у вас проблема в другом. ListView - древний и архаичный элемент, который категорически не рекомендуется использовать, когда вам не известно точное число элементов и/или оно не исчисляется в штуках. Отключите отображение картинок и откройте свой списко контактов, затем запустите LAyoutInspector. Вы увидите, что ваш ListView уходит далеко за пределы экрана, отправляя на рендер десятки и сотни расположенных в нем элементов-контактов, в то время как видно от силы десяток. Все эти элементы размещаются в оперативной памяти в растровом несжатом виде, что является огромным объемом. Например, fullHD экран имеет размер 1920 на 1080 пикселей, каждый пиксель занимает минимум 24бита(по 8 на каждый цвет - красный, синий, зеленый). А это, простите 1920 x 1080 x 24 бита, или почти 6 мегабайта. Теперь представьте, что вы создаете список на 100 элементов, когда на экран помещается только 10. Для их хранения в отрендереном виде потребуется минимум 60мб, а т.к. эти пререндеры хранятся немного сложнее, то объем легко начнет исчисляться сотнями. Вот вам и краш памяти после попытки засунуть в память еще один jpg файл.

Вам 100% требуется замена вашего ListView на RecyclerViewили подобный элемент. Он не создает вьюшки под всю 1000 контактов, а только под те, что попадают на экран. Picasso тоже можно использовать, как имнимум для упрощения вставки нового изображения в имеющийся ImageView, но даже без него проблема с памятью у вас решится одним переходом на RecyclerView, уверенность 99.99%

Answered by Спицко Дмитрий on December 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP