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

时间:2015-10-09 07:33:20

标签: android memory-management bitmap

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

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 错误。

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

2 个答案:

答案 0 :(得分:0)

对于Android 3.0及更高版本,GC(垃圾收集器)将完美地回收位图。

但是,如果您在旧版本上运行应用程序,由于GC不能很好地监控位图,您可能会获得OOM(内存不足)。

无论如何,只要您确定不再需要位图,我们仍建议您立即致电回收。它甚至对于新的Android版本也很好,因为它降低了自动内存管理所需的工作。

以下是回收位图的片段:

if (bitmap != null) {
    bitmap.recycle();
    bitmap = null;
}

在您的情况下,它会在imageView.setImageBitmap(bm);之后的下方。

if (bm != null) {
    bm.recycle();
    bm = null;
}

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

答案 1 :(得分:0)

当您在应用程序上使用过多图像时,最好使用能够自动呈现这些图像的库,因此不必担心内存管理。一个完美的例子是毕加索。看看Here