2014-03-26 228 views
0

我有3个ImageViews,我从网址随机设置图像。我得到java.lang.OutOfMemoryError。我正在使用以下代码为ImageView设置图像。如何摆脱java.lang.OutOfMemoryError?

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。任何想法我应该如何摆脱它?提前致谢。

+2

在谷歌查找内存泄漏。别客气。 (但是,如果你改变了,因为你没有关闭你在你的循环中打开的'imageUrl'流,所以你的图片会严格保留在后面) –

+1

有很好的库来处理下载和显示图像到imageview中,在google中搜索一些。 – hardartcore

回答

0

正如一条评论所暗示的,与位图相关的内存错误通常是上下文内存泄漏的结果。这里没有特别展示它,但ImageView的上下文可能会泄漏,因此每次重置图像时,它都会保留在上一张图片的内存空间中。这将很快超出你的记忆。您应该修复声明ImageView的任何泄漏,否则您可以在创建新的位图之前适当地清除图像引用。这将允许垃圾收集器再次释放空间。

前一段时间我问了一个类似的问题,因为几乎相同的原因,希望那里的答案可以帮助你。

Android : Static Fields and Memory Leaks

0

你可以看看像this这样的图书馆来将图像加载到你的视图中。另外,请查看关于Bitmap和内存管理的Google的recommendations。如果你想自己做一些清理,你可以使用bitmap.recycle()并设置Bitmap/Drawablenull