2015-09-16 38 views
0

这里看看下面的代码,回收位图中环

for (String path : all_path) { 
    bmp = BitmapFactory.decodeFile(path); 
    bitmapList.add(bmp); 
} 

这个代码是推动我疯了。由于在每次迭代中调用BitmapFactory.decodeFile(路径)并将结果驱动到内存中,结果发生OutOfMemory异常。我试图在解码新位图之前在循环中使用recycle()旧位图,但这意味着没有意义。我搜索了关于在循环中使用位图的答案,但未能找到答案。我该怎么办?任何人请帮助。

回答

0

您正在将所有位图添加到列表中。但是,对于所有位图,您都使用相同的参考变量bmp,因此在每次迭代中它们将被替换。

但在列表中所有的位图被添加。如果有许多位图,那么它最终会导致OutOfMemoryError

最好不要在列表中添加所有位图。

+0

你的要求。“但是,你正在使用相同的参考变量BMP那么在每次迭代中,他们得到更换所有位图”很奇怪。函数'decodeFile'每次循环都会返回一个新的对象。 List对象保留对每个位图的分隔符引用。 –

+0

@JaromírAdamec我只是想说,如果OP要在循环中处理位图,然后转到下一个位图。那么就不会有问题。由于引用变量将指向下一个位图对象,并且较早的变量符合GC的条件。但是,由于OP将所有位图添加到列表中,所以它是问题的原因。 – gprathour

0

尝试回收未使用的位图。 如果您使用所有位图,而不是将它们添加到缓存并稍后使用它们。
接下来,当你想要替换一个,你将只替换一个不是全部。
从下面的变化需要更多的工作,但它的作品,因为我用了很多位图。
请看看这里:
我实现了一次这样的事情:
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

0

位图可以是巨大的。为什么你需要把它们全部读到内存中?通常情况下,您会按需阅读每个位图。或者,您可以读取缩略图,这些内存要求要低得多(BitmapFactory使您可以在阅读时缩小位图尺寸 - 使用BitmapFactory.Options,成员inSampleSize)。

阅读:http://developer.android.com/training/displaying-bitmaps/index.html