android - OOM(内存不足异常)如何在android中发生?

标签 android imageview android-bitmap

我正在尝试在 ImageView 中显示来自画廊的图像或从相机捕获的图像。在此过程中,我开始出现 OOM。所以我决定找出它是如何工作的。所以我尝试使用不同尺寸的图像,这里是观察结果,

我试图将 19KB 的图像加载到 ImageView 中,但收到以下错误消息。 无法分配 4915212 字节的分配和 570452 个空闲字节和 557KB,直到 OOM 我得到了一个 2MB 的图像 无法分配 31961100 字节的分配,其中有 16777120 个空闲字节和 29MB,直到 OOM 2MB

为什么 19KB 的图像需要将近 4.6MB 的主存空间,而 2MB 的图像需要 30MB 的主存空间?

PS:我发现了很多解决方案,比如根据显示对图像进行下采样,但没有一个能解释这种行为。

最佳答案

理想情况下,您将为位图使用 ARGB_8888。这意味着为每个像素分配 4 个字节(每个像素用于 A、R、G、B)。这意味着加载 1024x768 图像需要 1024*768*4 = 3145728 B = 3072 KB = 3 MB。这就是使用巨大内存的原因。以下信息取自文档:http://developer.android.com/reference/android/graphics/Bitmap.Config.html

Bitmap.Config.ALPHA_8 - 每个像素都存储为单个半透明 (alpha) channel 。

Bitmap.Config.ARGB_4444 - 此字段已在 API 级别 13 中弃用。由于此配置质量较差,建议改用 ARGB_8888。

Bitmap.Config.ARGB_8888 - 每个像素存储在 4 个字节上。

Bitmap.Config.RGB_565 - 每个像素都存储在 2 个字节上,并且仅对 RGB channel 进行编码:红色以 5 位精度存储(32 个可能值),绿色以 6 位精度存储精度位(64 个可能值),蓝色以 5 位精度存储。

关于android - OOM(内存不足异常)如何在android中发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341709/

相关文章:

android - 控制 Android 设备上的显示刷新率

android - 如何将 Android 应用程序发布到特定屏幕分辨率的市场?

java - 您可以使用屏蔽或其他方式在单个 ImageView 中添加三个 onClick 监听器吗?

java - android:scaleType =“center”不能满足我的要求:dp和px如何工作?

java - 每次我尝试更改油漆的属性(厚度或颜色)时,它都会更改 Canvas 上已有的现有油漆(android)(java)

android - 使用 SIFT/SURF 进行特征提取 在 android 上使用 opencv 使用 Android Studio

android - apk 必须使用与之前版本相同的证书进行签名

android - 将 ImageView 从 PNG 替换为 GIF

android - 将照片上传到驱动器而不压缩

android - 为什么一个基本的 Android 应用程序在内存中有数百个位图?