我什么时候可以回收Bitmap?

时间:2013-07-31 14:34:40

标签: android

我遇到了严重的内存问题,我期待着回收位图。

然而,我的应用程序正在做什么,正在建立一个带有几个位图的画廊(是的,已弃用),然后是几个画廊。

所以在一天结束时,应用程序看起来像(LinearLayout样式):

*一些网页浏览量 *一个有7张图片的图库。 *一些网页浏览量 *包含10张图片的图库

等等。

所以我在想的是......一旦我显示了这些图像,并且它们在屏幕上,这些位图是否可以回收?

有没有办法回收整个图库组件?

非常感谢你。

编辑:

我已经尝试了很多东西。我仍然收到错误java.lang.IllegalArgumentException: bitmap size exceeds 32bits

这是我的实际代码:

BitmapFactory.Options bfOptions=new BitmapFactory.Options(); 
        bfOptions.inDither=false;          //Disable Dithering mode
        bfOptions.inPurgeable=true;       //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        bfOptions.inInputShareable=true;  //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        bfOptions.inTempStorage=new byte[32 * 1024]; 
        bfOptions.inInputShareable=true;
        bfOptions.inPreferredConfig = Bitmap.Config.RGB_565;    



        Bitmap bitmap = BitmapFactory.decodeFile(mUrls.get(position).getPath(), bfOptions);

        inflatedImageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 120, 120, false));

正如您所看到的,我为Bitmap设置了许多选项,并调整了它的大小,并降低了它的质量。仍然会出现同样的问题。

2 个答案:

答案 0 :(得分:1)

首先,您不应该手动调用system.gc,通常也不需要手动回收位图。让操作系统尽其所能,决定何时采取巨大的命中来运行垃圾收集。

图库被弃用的原因之一是我相当确定它只是在呈现时加载所有项目。并且不会像列表视图一样加载它们并按需回收它们。这意味着它是一个巨大的RAM浪费,没有多少回收可以帮助你。此外,Gallery在4.0+手机上非常小巧,这是此时Android用户群的主要部分。我强烈建议你不要使用画廊。

有两种选择。

1)查看现在内置于Support V4库中的寻呼机

2)Horizo​​ntalListView - > https://github.com/MeetMe/Android-HorizontalListView

另外,请确保在将所有图像加载到图像视图中之前对其进行下采样。要了解如何阅读http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

答案 1 :(得分:1)

确定。我解决了我遇到的问题;我有一个带有图库组件和webview的linearLayout。如果我没有渲染webview,那么应用程序就不会崩溃。

因此经过一些调整后,它可以正常工作而不会崩溃:

wv_detail.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);      
wv_detail.setLayerType(View.LAYER_TYPE_NONE, null);