我正在动态创建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 错误。
有关如何释放内存或回收的任何指示?
答案 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。