Android: как решить OutOfMemoryError
Я использую NestedScrollView
для моего макета для отображения TextView
в качестве заголовка с HorizontalScrollView
для отображения скользящих картинок.
Вот пример:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none"
android:layout_weight="1">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:textStyle="bold"
android:text="Cable Crunches"
android:id="@+id/cableCrunches"
android:gravity="center"
android:padding="3dp"
android:textSize="18sp"/>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/cableCrunches"
android:id="@+id/cableCrunchesPics">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cableCrunchesPics1"
android:src="@drawable/cable_crunches_1"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cableCrunchesPics2"
android:src="@drawable/cable_crunches_2"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cableCrunchesPics3"
android:src="@drawable/cable_crunches_3"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cableCrunchesPics4"
android:src="@drawable/cable_crunches_4"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cableCrunchesPics5"
android:src="@drawable/cable_crunches_5"/>
</LinearLayout>
</HorizontalScrollView>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
TextView
и HorizontalScrollView
блок используется около 15 раз в моем макете, и с этим дизайном у меня есть OutOfMemoryError.
Когда я использую меньше этих блоков, ошибка не появляется.
Я пытался минимизировать размер моих файлов PNG, но это не решает проблему.
Есть ли другой макет, который я мог бы использовать не все ImageView
загружаются в начале приложения?
3 ответа
Вам нужно использовать RecyclerView или ListView с ImageView
как элемент строки вместо HorizontalScrollView
, RecyclerView
создаст достаточно ImageView
s, чтобы заполнить экран. Когда пользователь прокручивает, он будет использовать существующие ImageView
"S.
Также рассмотрите возможность использования библиотеки загрузки изображений для асинхронной загрузки изображений. Glide или Picasso - действительно хорошие библиотеки.
Добавьте эту строку в манифест в теге приложения
android:largeHeap="true"
Может быть, это поможет вам
И да, как говорили другие. Вы можете использовать разные библиотеки для загрузки изображений. Я бы порекомендовал Universal Image Loader. Ссылка на сайт
Вы можете использовать библиотеку для загрузки изображений. Мой любимый - Glide, он прост в использовании https://github.com/bumptech/glide.
Таким образом, вы будете загружать свои изображения программно. Вы также получаете больше контроля над тем, как, когда и где загружать изображения. Glide также решил некоторые проблемы с памятью в моем приложении.