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](https://i.stack.imgur.com/ftEtp.png)
Вот 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>