android - Android 可绘制内存管理
问题描述
我在我的一项活动中实现了 RecyclerView。我使用定制的 RecyclerView 适配器从 SQLite 数据库加载数据(使用 Room 和 LiveData 结构)并将其显示在视图中。
所有行都有一个大的 ImageView,我想在其中显示一个 Drawable(只是一个 .png)。为此,我首先尝试使用官方 Android 开发者网站上编写的方法,但对我来说效果不佳。因此,我尝试使用Glide作为 Google 推荐的库。
我的项目中有 16 个可绘制对象。它们都具有 800x800 和 1920x1080 像素之间的缩放比例。
在我的适配器中,我从我的数据库中加载数据,并基于可绘制的 id 和图像(因此数据库中没有存储图像数据;我以前这样做过)。
不幸的是,我的应用程序无法处理导致OutOfMemoryError 异常的大量图像缓存。这就是为什么我用
android:largeHeap = "true"
在我的 Android 清单中。
我知道这不是一个好的解决方案,而且我也知道必须有一种方法可以为这么少量的图片使用更少的内存。
在滑翔我使用
GlideApp
.load(R.drawable.my_drawable)
.fitcenter()
.into(myImageView);
但不幸的是,图像并没有缩小或变小。我认为 Glide 可以根据 ImageView 的大小、屏幕大小等来缩放图像。
我究竟做错了什么?有没有更好的方法在没有固定缩放的情况下使用更少的内存,这样我的图片就不会变得难看?
编辑: 我首先将图像存储在项目结构中的基本“可绘制”文件夹中(复制和粘贴)。我的第二种方法是gimp-android-xdpi 插件,它可以为任何 android 密度(mdpi、hdpi、xhdpi 等)导出图像或图标。但这也无济于事。
解决方案
调用覆盖(horizontalSize,verticalSize)。
这将在 ImageView 中显示之前调整图像大小。
推荐阅读
- python - 如何根据另一列中的值创建唯一 ID
- python - 如何定义一个从列表中删除 x 最小值的函数
- perl - 当前包声明的子程序列表
- python - 为什么 torch.add 和 torch.einsum 返回不同的结果?
- r - 如何重命名R中绘图的类别?
- java - 使用 JPA 按嵌套属性排序时结合 DISTINCT 和 ORDER BY
- python - Pandas 根据其他列的窗口间隔求和列
- c++ - windows到linux使用多个外部库
- webassembly - emscripten:在 C 中使用全局变量
- java - Erroe 501 未记录的 java API GET