【发布时间】:2011-05-05 09:41:14
【问题描述】:
在我的应用程序中,我从 JPEG 和 PNG 文件中加载了几个图像。当我将所有这些文件放入 assets 目录并以这种方式加载时,一切正常:
InputStream stream = getAssets().open(path);
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, null);
stream.close();
return new BitmapDrawable(bitmap);
但是当我尝试从 sd 卡加载完全相同的图像时,我得到了 OutOfMemory 异常!
InputStream stream = new FileInputStream("/mnt/sdcard/mydata/" + path);
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, null);
stream.close();
return new BitmapDrawable(bitmap);
这是我在日志中得到的:
11-05 00:53:31.003: ERROR/dalvikvm-heap(13183): 827200-byte external allocation too large for this process.
11-05 00:53:31.003: ERROR/GraphicsJNI(13183): VM won't let us allocate 827200 bytes
...
11-05 00:53:31.053: ERROR/AndroidRuntime(13183): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
11-05 00:53:31.053: ERROR/AndroidRuntime(13183): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
...
为什么会发生这种情况?
更新:在真实设备上尝试了这两种方法 - 似乎我无法将超过 12MB 的位图加载到所谓的“外部存储器”(这不是 sd 卡)中。
【问题讨论】:
-
你在什么条件下测试上面的代码?在模拟器中,或连接 USB 的真实设备中?可能是您的 USB 模式设置为锁定 SD 卡的磁盘模式。
-
我在模拟器中运行这段代码。
-
jpg/png 文件的大小是多少?
-
我加载的最大JPG文件大小为400KB,为800x600x24。
-
你有 800x600 的屏幕吗?如果你不这样做,你应该对图像进行超采样以使用更少的内存。 stackoverflow.com/questions/477572/…
标签: android out-of-memory