Glide не загружает все изображения (локальные файлы) (OutOfMemory) - PullRequest
1 голос
/ 08 мая 2019

Glide Version 4.9.0

В моем приложении у меня есть 10 действий.Пользователь нажимает кнопку «Далее» на каждом действии, чтобы перейти к следующему действию, пока он в конечном итоге не достигнет последнего действия.Первые 5 действий содержат ImageViews.

Первые 3 действия имеют одно большое ImageView.

В действии 4 есть 5 меньших ImageViews.

В действии 5 есть8 меньше ImageViews.

_

Загружаемые изображения находятся в ресурсах проекта в папке drawable.

До того, как я использовал Glide,Я просто использовал атрибут android:src ImageView в моих xml-файлах, что приводило к следующей ошибке на устройстве Galaxy S6, когда пользователь пытается открыть Activity Four с 5 ImageViews:

java.lang.OutOfMemoryError: Не удалось выделить 10240012 байтов с 6982184 свободными байтами и 6 МБ до OOM

Поэтому я решил использовать Glide для загрузки изображений в ImageViews и удалил атрибуты android:src.Картинки выглядели размытыми, поэтому я добавил dontTransform() к своим заявлениям:

Glide.with(this).load(R.drawable.myImg1).dontTransform().skipMemoryCache(true).listener(new LoggingListener(getApplicationContext())).into(iv_p1);

На эмуляторе и моем физическом устройстве (Xiaomi Mi A2 Android 9) все выглядело нормально.Единственным недостатком Glide является то, что вы можете ImageViews загружать свои Изображения один за другим.

На Galaxy S6, который выбросил OutOfMemoryError ранее, все Действия показывались без каких-либо ошибок.Но только первые 4 из 8 ImageViews загрузили свои изображения.Я предполагал, что ОЗУ все еще является проблемой, и что Glide просто предотвращает переполнение, останавливая загрузку изображений.Поэтому я изменил размер файлов изображений с 500x500 до 200x200.

Теперь первые 6 из 8 ImageViews загрузили свои изображения.

LeakCanary не показывает никаких утечек.

Журналы ошибок Glide:

Failed to load resource
There were 4 causes:
java.lang.OutOfMemoryError(Failed to allocate a 26214412 byte allocation with 932280 free bytes and 910KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 26214412 byte allocation with 922168 free bytes and 900KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 2560012 byte allocation with 914680 free bytes and 893KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 2560012 byte allocation with 937496 free bytes and 915KB until OOM)
call GlideException#logRootCauses(String) for more detail

Я действительно не могу опускаться с разрешением без снижения качества и даже если бы яустановите достаточно низкое разрешение для отображения всех изображений на устройстве, но не гарантируется, что другие устройства с еще меньшей памятью также будут отображать все изображения.

Я не могу воспроизвести это поведение на своем собственном устройстве или на любом другом устройстве.эмуляторы (даже при установке оперативной памяти эмулятора минимум на 128 МБ).Можно ли выгрузить изображения текущей активности при переходе к следующей для освобождения памяти?

РЕДАКТИРОВАТЬ:

Память на эмуляторе идет от 40МБ при запуске до 220 МБ после загрузки всех изображений.Изображения представляют собой файлы JPG с разрешением 200x200 пикселей.

Предварительный просмотр следующего XML-макета:

enter image description here

Вот XML-макет действия с 8 ImageViews:

<TextView
android:id="@+id/tv_main5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:paddingTop="10dp"
android:paddingEnd="10dp"
 />

<LinearLayout

android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:text="@string/step5"
    android:textSize="20sp"
    />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:gravity="center"

    >

    <LinearLayout
        android:id="@+id/dreieck_wild"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:orientation="vertical"
        android:paddingStart="10dp"
        android:paddingLeft="10dp"
        android:paddingEnd="10dp"
        android:paddingRight="10dp">

        <ImageView
            android:id="@+id/ic_p1"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"

          />

        <RadioButton
            android:id="@+id/rb11"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/dreieck_wild" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/langloch"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p2"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
  />
        <RadioButton
            android:id="@+id/rb22"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/langloch"/>
    </LinearLayout>
    <LinearLayout

        android:id="@+id/quadrat"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p3"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            />
        <RadioButton
            android:id="@+id/rb33"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/quadrat"/>
    </LinearLayout>



</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:gravity="center"

    >

    <LinearLayout
        android:id="@+id/raute_versetzt"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"

        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p4"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
   />
        <RadioButton
            android:id="@+id/rb44"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/raute_versetzt"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/raute"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p5"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
    />
        <RadioButton
            android:id="@+id/rb55"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/raute"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/rundloch_klein"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p6"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
        />
        <RadioButton
            android:id="@+id/rb66"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/rundloch_klein"/>
    </LinearLayout>



</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:gravity="center"

    >


    <LinearLayout
        android:id="@+id/rundloch_wild"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p7"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
  />
        <RadioButton
            android:id="@+id/rb77"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/rundloch_wild"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/schachbrett"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p8"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
          />
        <RadioButton
            android:id="@+id/rb88"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/schachbrett"/>
    </LinearLayout>


</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical"

    >

    <Button
        android:id="@+id/next5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"

        android:enabled="false"
        android:text="@string/next"

        />
</LinearLayout>

Ответы [ 3 ]

1 голос
/ 08 мая 2019

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

В каждом занятии:

@override
protected void onStart() {
    Glide.with(this).load(R.drawable.img).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).dontTransform().into(imageView);
    super.onStart();
}

@override
protected void onStop() {
    Glide.with(this).clear(imageView);
    super.onStop();
}

Также

Предоставление изображений для разных разрешений экрана может помочь максимально сократить использование памяти. Я использовал NativeScript Image Builder для создания всех своих активов.

0 голосов
/ 08 мая 2019
.diskCacheStrategy(DiskCacheStrategy.NONE)
0 голосов
/ 08 мая 2019

Попробуйте изменить код Glide, например:

Glide.with(this)
     .load(R.drawable.myImg1)
     .skipMemoryCache(true)
     .dontTransform().into(iv_p1);

Также, если ваше изображение не изменяется динамически (имеется в виду, что есть изображения, которые загружаются динамически и не будут изменяться динамически), добавьте строку:

.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)

...