Glide 没有加载所有图片(本地文件)(OutOfMemory)
Glide does not load all images (local files) (OutOfMemory)
Glide 版本 4.9.0
在我的应用程序中,我有 10 个活动。用户在每个 activity 上单击下一步以导航到下一个,直到他最终到达最后一个 activity。
前 5 个活动包含 ImageViews
.
前 3 个活动有一个大 ImageView
。
Activity四小五小ImageViews
.
Activity五小8个ImageViews
.
_
要加载的图片位于drawable
文件夹中的项目资源中。
在我使用Glide
之前,我只是在我的xml文件中使用了ImageView
的android:src
属性,
当用户尝试打开 Activity Four with the 5 ImageViews
:
时,这会导致 Galaxy S6 设备出现以下错误
java.lang.OutOfMemoryError: Failed to allocate a 10240012 byte
allocation with 6982184 free bytes and 6MB until OOM
所以我决定使用 Glide
将图像加载到 ImageViews
并删除 android:src
属性。图片看起来很模糊,所以我在我的陈述中添加了 dontTransform()
:
Glide.with(this).load(R.drawable.myImg1).dontTransform().skipMemoryCache(true).listener(new LoggingListener(getApplicationContext())).into(iv_p1);
在模拟器和我的物理设备 (小米 Mi A2 Android 9) 上一切看起来都很好。
Glide 唯一的缺点是你可以看到 ImageViews
一个接一个地加载他们的图像。
在之前抛出 OutOfMemoryError
的 Galaxy S6 上,所有活动均显示无误。
但是 只有 8 个中的前 4 个 ImageViews
加载了他们的图像。
我假设 RAM 仍然是一个问题,而 Glide 只是通过停止加载图像来防止溢出。所以我将图像文件的大小从 500x500 调整为 200x200。
现在 前 6 个 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
我真的不能在不降低质量的情况下降低分辨率,即使我将分辨率设置得足够低以显示设备上的所有图像,也不能保证其他内存更低的设备也能显示所有图像,也是。
我无法在我自己的设备或任何模拟器上重现此行为(即使将模拟器的 RAM 设置为最小 128MB 也无法重现)。
是否可以在转到下一张时卸载当前activity的图像以释放一些内存?
编辑:
模拟器上的内存从启动时的 40 MB 增加到加载所有图像后的 220 MB。图片是 200x200 像素的 JPG 文件。
以下xml布局的预览:
这是具有 8 个 ImageView 的 activity 的 xml 布局:
<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>
尝试像这样更改 Glide 代码:
Glide.with(this)
.load(R.drawable.myImg1)
.skipMemoryCache(true)
.dontTransform().into(iv_p1);
此外,如果您的图像没有动态变化(意味着是否有任何图像正在动态加载并且不会动态更改),则添加行:
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.diskCacheStrategy(DiskCacheStrategy.NONE)
在离开 activity 时删除所有图像,然后在返回 Activity 时删除所有图像 re-adding 保持低内存足以在大多数设备上工作。
每个Activity:
@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 创建了我所有的资产。
Glide 版本 4.9.0
在我的应用程序中,我有 10 个活动。用户在每个 activity 上单击下一步以导航到下一个,直到他最终到达最后一个 activity。
前 5 个活动包含 ImageViews
.
前 3 个活动有一个大 ImageView
。
Activity四小五小ImageViews
.
Activity五小8个ImageViews
.
_
要加载的图片位于drawable
文件夹中的项目资源中。
在我使用Glide
之前,我只是在我的xml文件中使用了ImageView
的android:src
属性,
当用户尝试打开 Activity Four with the 5 ImageViews
:
java.lang.OutOfMemoryError: Failed to allocate a 10240012 byte allocation with 6982184 free bytes and 6MB until OOM
所以我决定使用 Glide
将图像加载到 ImageViews
并删除 android:src
属性。图片看起来很模糊,所以我在我的陈述中添加了 dontTransform()
:
Glide.with(this).load(R.drawable.myImg1).dontTransform().skipMemoryCache(true).listener(new LoggingListener(getApplicationContext())).into(iv_p1);
在模拟器和我的物理设备 (小米 Mi A2 Android 9) 上一切看起来都很好。
Glide 唯一的缺点是你可以看到 ImageViews
一个接一个地加载他们的图像。
在之前抛出 OutOfMemoryError
的 Galaxy S6 上,所有活动均显示无误。
但是 只有 8 个中的前 4 个 ImageViews
加载了他们的图像。
我假设 RAM 仍然是一个问题,而 Glide 只是通过停止加载图像来防止溢出。所以我将图像文件的大小从 500x500 调整为 200x200。
现在 前 6 个 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
我真的不能在不降低质量的情况下降低分辨率,即使我将分辨率设置得足够低以显示设备上的所有图像,也不能保证其他内存更低的设备也能显示所有图像,也是。
我无法在我自己的设备或任何模拟器上重现此行为(即使将模拟器的 RAM 设置为最小 128MB 也无法重现)。 是否可以在转到下一张时卸载当前activity的图像以释放一些内存?
编辑:
模拟器上的内存从启动时的 40 MB 增加到加载所有图像后的 220 MB。图片是 200x200 像素的 JPG 文件。
以下xml布局的预览:
这是具有 8 个 ImageView 的 activity 的 xml 布局:
<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>
尝试像这样更改 Glide 代码:
Glide.with(this)
.load(R.drawable.myImg1)
.skipMemoryCache(true)
.dontTransform().into(iv_p1);
此外,如果您的图像没有动态变化(意味着是否有任何图像正在动态加载并且不会动态更改),则添加行:
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.diskCacheStrategy(DiskCacheStrategy.NONE)
在离开 activity 时删除所有图像,然后在返回 Activity 时删除所有图像 re-adding 保持低内存足以在大多数设备上工作。
每个Activity:
@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 创建了我所有的资产。