Android 将位图添加到20个动态图像视图会导致java.lang.OutOfMemoryError错误

Android 将位图添加到20个动态图像视图会导致java.lang.OutOfMemoryError错误,android,memory-management,bitmap,Android,Memory Management,Bitmap,我正在动态创建20个图像视图,并将位图设置为背景。我正在从SD卡中存储的图像创建位图 for (int i = 0; i < 20; i++) { imageView = new ImageView(this); imageView.setId(i); imageView.setPadding(2, 2, 2, 2); imageView.setScaleType(I

我正在动态创建20个图像视图,并将位图设置为背景。我正在从SD卡中存储的图像创建位图

for (int i = 0; i < 20; i++) {
            imageView = new ImageView(this);
            imageView.setId(i);

            imageView.setPadding(2, 2, 2, 2);            

            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            layout.addView(imageView);

            android.view.ViewGroup.LayoutParams params = imageView.getLayoutParams();
            params.width = 200;
            params.height = 200;
            imageView.setLayoutParams(params);            

            // display thbe Bitmap in the ImageView

            bm = BitmapFactory.decodeFile(pathOfImage+i);
            ByteArrayOutputStream bao2 = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.PNG, 50, bao2);

            imageView.setImageBitmap(bm);
}
我得到一个java.lang.OutOfMemoryError错误


关于如何释放内存或回收的任何指示?

对于Android 3.0及以上版本,GCGarbage Collector将完美地回收位图

然而,如果你在旧版本上运行你的应用程序,因为位图不能很好地被GC监控,你可能会得到很多内存

在任何情况下,只要确定不再需要位图,仍然建议调用recycle。它甚至对新的android版本也很好,因为它降低了自动内存管理所需的工作量

以下是回收位图的片段:

if (bitmap != null) {
    bitmap.recycle();
    bitmap = null;
}
在您的情况下,在imageView.setImageBitmapbm;之后会像下面这样


*OOM还取决于加载的图像类型图像大小、图像像素等。

当你在应用程序中使用图像太多时,最好使用自动渲染这些图像的库,这样就不必担心内存管理。毕加索就是一个很好的例子。看看。

图像有多大?图像是1000*1000像素。大约1MB大小。
if (bm != null) {
    bm.recycle();
    bm = null;
}