- PVSM.RU - https://www.pvsm.ru -
Привет! В данной статье, ориентированной на новичков, я бы хотел дать несколько советов по оптимизации использования приложением памяти устройства, дабы постоянно не получать OutOfMemory, а также рассмотреть использование векторных изображений в текущей актуальной версии Android Studio (3.4), так как большинство русскоязычных ресурсов по этой теме (последняя статья [1] на Хабре про векторные изображения датируется 2015 годом) устарели, что нередко вводит начинающих разработчиков в заблуждение. Итак, приступим.
Конечно, большие изображения с множеством мелких деталей не стоит переводить в вектор — это займёт столько же места, как и растр, если не больше. Однако мелкие изображения, вроде иконок и остальных деталей пользовательского интерфейса следует конвертировать в вектор в целях экономии памяти. Да и работать с векторными изображениями [2] зачастую гораздо удобнее. А теперь, самое главное — как это сделать?
Для конвертации из растра в вектор могу посоветовать отличное бесплатное приложение Inkscape [3]. Немного о работе с ним:
Больше сканирований — больше цветов, оттенков и деталей. Моему лепрекону, чтобы приобрести божеский вид, по причине большего количество цветов в изображении понадобилось 30 сканирований. Это довольно много, лучше делать не больше десяти и выбирать картинки попроще.
Теперь проведём небольшой тест, доказывающий преимущество вектора в экономии памяти.
Я создал новый проект с одним-единственным ImageView, к которому применил анимацию, перемещающую его из точки А в точку Б, поочерёдно изменив изображения на растровое и векторное. Смотрим данные.
Растр
Вектор
Разница почти что в два раза. Думаю, это достаточно убедительно.
Для этого перейдите в манифест вашего проекта (app > manifests > AndroidManifest.xml) и в колонке application добавьте строку:
android:largeHeap="true"
По сути, увеличение «кучи» — это не решение проблемы OutOfMemory, а её задвигание на дальнюю полку. Вместо того, чтобы оптимизировать использование приложением памяти устройства, мы даём ему больше места. Не стоит забывать и то, что у каждого устройства свой объём памяти, как основной, так и дополнительной, выделяемой под приложение.
Любое приложение в своей работе использует множество объектов, которые, естественно, занимают определённое место в памяти. В идеале, сборщик мусора должен удалять из неё неиспользуемые объекты, но иногда появляются так называемые «утечки памяти», которые вызывают серьёзные проблемы в работе приложения. Существуют различные причины утечек памяти, о которых подробно рассказано тут [4].
От себя хотел бы посоветовать библиотеку WeakHandler [5], разработанной компанией Badoo, и призванной устранить утечки памяти, связанные с неправильным использованием android.os.Handler. Для использования данной библиотеки добавьте в свой gradle-файл (Gradle Scripts > build.gradle (Module:app)) в колонку dependencies строку:
compile 'com.badoo.mobile:android-weak-handler:1.1'
а в Java-файл:
private WeakHandler mHandler;
protected void onCreate(Bundle savedInstanceState) {
mHandler = new WeakHandler();
...
}
private void onClick(View view) {
mHandler.postDelayed(new Runnable() {
view.setVisibility(View.INVISIBLE);
}, 5000);
}
И не забудьте импортировать сам WeakHandler, если студия не сделала это автоматически.
Покадровая анимация в Android Studio — штука удобная, но далеко не самая экономичная. При использовании в ней большого количества изображений, вы непременно получите OutOfMemory.
Но, если уж вам это очень понадобилось, лучше используйте gif-изображение вместе с библиотекой Android Gif Drawable [6]. Эта библиотека упрощает работу c gif, а также потребляет гораздо меньше памяти, чем покадровые анимации Android Studio. Для использования данной библиотеки добавьте в свой gradle-файл (Gradle Scripts > build.gradle (Module:app)) в колонку dependencies строку:
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
и в свой второй gradle-файл (Gradle Scripts > build.gradle(Modue:«название вашего приложения»)) в колонки buildscript и allproject строку:
mavenCentral()
а в Java-файл:
GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.имя_файла );
gifFromResource.start();
Для отключения gif вместо start() пишем stop(). Также не забывайте сжать gif-ки, это сэкономит ещё больше места.
Надеюсь, что моя статья была вам полезна. Спасибо.
Автор: Scara31
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/316630
Ссылки в тексте:
[1] статья: https://habr.com/ru/post/265601/
[2] векторными изображениями: https://ru.wikipedia.org/wiki/Векторная_графика
[3] Inkscape: https://inkscape.org/ru/
[4] тут: https://habr.com/ru/company/sebbia/blog/243537/
[5] WeakHandler: https://github.com/badoo/android-weak-handler
[6] Android Gif Drawable: https://github.com/koral--/android-gif-drawable
[7] Источник: https://habr.com/ru/post/450566/?utm_source=habrahabr&utm_medium=rss&utm_campaign=450566
Нажмите здесь для печати.