【问题标题】:Android drawable memory managementAndroid 可绘制内存管理
【发布时间】:2018-07-03 09:49:54
【问题描述】:

我在我的一个活动中实现了 RecyclerView。 我使用定制的 RecyclerView 适配器从 SQLite 数据库加载数据(使用 Room 和 LiveData 结构)并将其显示在视图中。

所有行都有一个大的 ImageView,我想在其中显示一个 Drawable(只是一个 .png)。为此,我首先尝试使用写在official Android Developers site 上的方法,但对我来说效果不佳。 因此我尝试使用Glide 作为谷歌推荐的库。

我的项目中有 16 个可绘制对象。它们都具有 800x800 到 1920x1080 像素之间的缩放比例。

在我的适配器中,我从我的数据库中加载数据,并根据可绘制的 id 和图像(因此数据库中没有存储图像数据;我以前这样做过)。

不幸的是,我的应用程序无法处理导致OutOfMemoryError exception 的大量图像缓存。这就是我使用的原因

 android:largeHeap = "true"

在我的 Android 清单中。

我知道这不是一个好的解决方案,而且我也知道必须有一种方法可以为这么少量的图片使用更少的内存。

在 Glide 中我使用

 GlideApp
          .load(R.drawable.my_drawable)
          .fitcenter()
          .into(myImageView);

但不幸的是,图像并没有缩小或变小。我认为 Glide 可以根据 ImageView 的大小、屏幕大小等来缩放图像。

我做错了什么?有没有更好的方法在不固定缩放的情况下使用更少的内存,这样我的图片就不会变丑?

编辑: 我首先将图像存储在项目结构中的基本“可绘制”文件夹中(复制和粘贴)。 我的第二种方法是gimp-android-xdpi addon,它为任何安卓密度(mdpi、hdpi、xhdpi 等)导出图像或图标。但这也无济于事。

【问题讨论】:

  • 您将这些图像存储在哪个可绘制文件夹中?
  • @AbuYousuf 我编辑了我的帖子

标签: android image memory-management garbage-collection android-glide


【解决方案1】:

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

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

【讨论】:

  • 但是如果我想针对不同的屏幕尺寸(ImageView 尺寸)执行此操作怎么办?我以为这是fitcenter() 应该做的?
  • 也许你可以在你把这个位图放入imageview之前覆盖大小,并且仍然会出现观看oom
  • 计算你的ImageView宽高以及使用override(imageVIewWidth, imageViewHeight).方法
  • 您可以存储在nodpi文件夹中。该文件夹图像未按系统缩放。我
  • 听起来是个好主意。但是fitcenter()centerCrop() 的目的是什么?这些方法不就是自动完成的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多