0

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

但是,我的应用正在做 atm,正在构建一个包含几个位图的画廊(是的,已弃用),然后是几个画廊。

所以在一天结束时,应用程序看起来像(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));

如您所见,我为位图设置了许多选项,并调整了它的大小并降低了它的质量。仍然发生同样的问题。

4

2 回答 2

1

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

不推荐使用画廊的原因之一是我相当确定它会在渲染后立即加载所有项目。并且不会像列表视图那样按需加载和回收它们。这意味着这是对 RAM 的巨大浪费,再多的回收也无济于事。此外,Gallery 在 4.0+ 的手机上非常有问题,目前这是大多数 Android 用户群。我强烈建议您不要使用画廊。

有两种选择。

1) View Pager 现在内置在 Support V4 库中

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

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

于 2013-07-31T15:53:53.963 回答
1

好的。我解决了我遇到的问题;我有一个带有画廊组件和网络视图的线性布局。如果我没有渲染 webviews,应用程序就不会崩溃。

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

wv_detail.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);      
wv_detail.setLayerType(View.LAYER_TYPE_NONE, null);
于 2013-08-09T11:40:14.027 回答