首页 > 解决方案 > 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 等)导出图像或图标。但这也无济于事。

标签: androidimagememory-managementgarbage-collectionandroid-glide

解决方案


调用覆盖(horizo​​ntalSize,verticalSize)。

这将在 ImageView 中显示之前调整图像大小。


推荐阅读