2014-03-26 225 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