Java内存分配解决方法

时间:2012-02-26 19:00:12

标签: java android bitmap

我正在尝试为Android平台编写一个程序来处理图像。 请考虑以下事项:

Bitmap b = BitmapFactory.decodeFile(File imagePath) // 5mb picture is stored into memory as with 32bits of memory per pixel --> almost run out of memory

我想要更改此Bitmap中的像素,但由于某种原因,返回的Bitmap是不可变的。我想用b.copy复制它(Config config,boolean isMutable) 虽然我遇到了一个RuntimeExeception,说VM不会让我们分配blah blah字节的内存。 我的问题是,将是以下行

Bitmap mutable = BitmapFactory.decodeFile(File imagePath).copy(config, true);

分配更少的内存,因此可以安全地用于获取Bitmap的可变副本,因为没有对原始不可变Bitmap的引用? 这似乎有时可以完成这项工作,但我想解释一下,我只是在胡说八道,或者我正在做的是一个聪明的解决方法来完成我的任务。

2 个答案:

答案 0 :(得分:2)

没有。复制方法在将不可变位图复制到可变位图时对其进行引用。此引用称为this。所以你仍然可以同时引用这两个位图。

您可以传递给BitMapFactory Options方法的decodeFile对象具有inMutable选项,这样可以完全避免不可变位图。

答案 1 :(得分:0)

第二种情况可能有效,因为它恰好足够快地清除了对第一个位图的引用,尽管它似乎应该不起作用,因为它们都是还活着的同时还活着。然而,5mb图片似乎正在推动它(它的分辨率是多少?)。请注意,应用程序可用的内存差异很大(主要取决于特定设备的屏幕分辨率),因此无论您正在做什么,都可能无法在其他较小的设备中使用。所以真正的问题是:你真的需要全尺寸位图吗?