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 создаст достаточно ImageViews, чтобы заполнить экран. Когда пользователь прокручивает, он будет использовать существующие ImageView"S.

Также рассмотрите возможность использования библиотеки загрузки изображений для асинхронной загрузки изображений. Glide или Picasso - действительно хорошие библиотеки.

Добавьте эту строку в манифест в теге приложения

 android:largeHeap="true"

Может быть, это поможет вам

И да, как говорили другие. Вы можете использовать разные библиотеки для загрузки изображений. Я бы порекомендовал Universal Image Loader. Ссылка на сайт

Вы можете использовать библиотеку для загрузки изображений. Мой любимый - Glide, он прост в использовании https://github.com/bumptech/glide.

Таким образом, вы будете загружать свои изображения программно. Вы также получаете больше контроля над тем, как, когда и где загружать изображения. Glide также решил некоторые проблемы с памятью в моем приложении.

Другие вопросы по тегам