android - Glide 不会加载所有图像(本地文件)(OutOfMemory)
问题描述
滑翔版 4.9.0
在我的应用程序中,我有 10 个活动。用户在每个活动上单击下一步以导航到下一个活动,直到他最终到达最后一个活动。前 5 个活动包含ImageViews
.
前3个活动有一个大ImageView
。
活动四有 5 个较小的ImageViews
.
活动五有 8 个较小的ImageViews
.
_
要加载的图像位于drawable
文件夹中的项目资源中。
在我使用之前Glide
,我只是在我的 xml 文件中使用了 的android:src
属性,ImageView
当用户尝试使用 5 打开活动四时,这会导致 Galaxy S6 设备上出现以下错误ImageViews
:
java.lang.OutOfMemoryError:无法分配 10240012 字节分配,其中 6982184 空闲字节和 6MB 直到 OOM
所以我决定使用Glide
将图像加载到ImageViews
并删除android:src
属性。图片看起来很模糊,所以我dontTransform()
在我的陈述中添加了:
Glide.with(this).load(R.drawable.myImg1).dontTransform().skipMemoryCache(true).listener(new LoggingListener(getApplicationContext())).into(iv_p1);
在模拟器和我的物理设备(小米米 A2 Android 9)上,一切看起来都很好。Glide 唯一的缺点是你可以看到ImageViews
一个接一个的加载他们的图像。
在投掷之前的 Galaxy S6 上OutOfMemoryError
,所有的活动都显示没有任何错误。但只有 8 个中的前 4 个 ImageViews
加载了他们的图像。我假设 RAM 仍然是一个问题,而 Glide 只是通过停止加载图像来防止溢出。所以我将图像文件的大小从 500x500 调整为 200x200。
现在 8 个中的前 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)。是否可以在转到下一个活动时卸载当前活动的图像以释放一些内存?
编辑:
模拟器上的内存从启动时的 40 MB 增加到加载所有图像后的 220 MB。图像是 200x200 像素的 JPG 文件。
以下 xml 布局的预览:
这是带有 8 个 ImageView 的活动的 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>
解决方案
离开活动时删除所有图像,然后在返回活动时重新添加所有图像,可以使内存足够低以在大多数设备上工作。
在每个活动中:
@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来创建我的所有资产。
推荐阅读
- gstreamer - 如何使用 gstreamer 在客户端指定 rtsp 身份验证凭据?
- python - 如何通过python在json中对象的特定键/值处写入或附加
- java - 数组索引我们的边界
- node.js - 如何使用车把将键添加为表中的标题?
- android - Android 捕获内部(应用程序)音频
- python - 如何将键、值对附加到以索引值作为键对的空字典中?
- database - 存储一组坐标以基于接近度进行快速查找的最佳方法是什么?
- discord.js - 当特定用户发送消息时,Discord 机器人会发送重播
- google-cloud-platform - 有没有办法从控制台批量删除表?
- java - 运行测试时在 Spring MvC 中注入 bean