我有3个ImageViews,我正在从URL中随机设置图像。我得到java.lang.OutOfMemoryError。我正在使用以下代码为ImageView设置图像。
public void changeImages(){
try {
for(int i=0; i<items.size(); i++){
URL imageUrl = new URL(items.get(i).getImageUrl());
if(i == 0){
image1.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));
}else if(i == 1){
image2.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));
}else if(i == 2){
image3.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));
}
}
} catch (Exception ex) {
System.out.println("Exception in parseResponse: "+ex);
}
}
image1,image2和image3是ImageViews。多次更改图像后,我得到了java.lang.OutOfMemoryError。知道怎么摆脱它?提前谢谢。
答案 0 :(得分:0)
正如一条评论所暗示的,与Bitmap相关的内存错误通常是上下文内存泄漏的结果。你没有特别在这里展示它,但你的ImageView的上下文可能会泄漏,所以每次你重置图像时,它仍然保持在前一张图片的内存空间。这将很快超出你的记忆。您应该修复声明ImageView的任何泄漏,否则您可以在创建新的Bitmap之前适当地清除图像引用。这将允许垃圾收集器再次释放空间。
前一段时间我问了一个类似的问题,原因几乎相同,希望那里的答案能帮到你。
答案 1 :(得分:0)
我猜您需要使用BitmapFactory选项加载缩放图像,例如
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);
另见http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html
此外,您可能需要调用bitmap.recycle();
答案 2 :(得分:0)
您可以查看像this这样的库,将图片加载到您的视图中。另外,请查看Google recommendations关于Bitmap
和内存管理的问题。如果您想自己进行一些清理,可以使用bitmap.recycle()
并将Bitmap
/ Drawable
设置为null
。