2013-03-04 35 views
0

我使用的是顯示文本和圖像的列表視圖。我正在嘗試使用Task對象異步下載圖像並將它們加載到視圖中以使ListView高效滾動。但是我經常會遇到OutOfMemoryException異常,因爲即使我將它們保存到光盤並訪問它,內存中的Bitmap也有太多。我看到的一個原因是,創建了許多任務(對於20個圖像,創建了20個任務),並且可能會佔用內存。有沒有一種有效的方法來做到這一點?Monodroid有效地加載圖像

這裏是code

回答

1

你必須擴展您的位圖,使得他們沒有得到他們的全分辨率爲加載到內存中。內存中的100kb大小的位圖是400kb,因爲您需要分配每像素4bytes來保存Alpha,Red,Green和Blue的所有顏色值。如果您使用相機拍攝圖像,它們很容易變成10倍大小,並且很快佔用大量內存。

我看到你在DecodeSampledBitmap中縮放圖像,但是當你不再需要它時,你也需要處理它。

SetBitmap你忘了處置您的位圖,你可以簡單地把一個using聲明它周圍:

using(var bitmap = ImageDownloader.DownloadImage(url, width, height)) 
{ 
    if(!token.IsCancellationRequested) 
     (this.m_context as Activity).RunOnUiThread(
       () => imageView.SetImageBitmap(bitmap) 
      ); 
} 

還請看看在Xamarin文檔的Load Large Bitmaps Efficiently article

+0

感謝Cheesebaron,我記得之前嘗試過,也只是嘗試過。我沒有看到內存錯誤,但我也沒有看到視圖上的圖像! – Rohith 2013-03-04 13:34:36

+0

另外,當我試圖做Xamarin建議在加載大位圖文章bitmap.Recycle,我得到這個錯誤03-03 22:45:34.159 E/AndroidRuntime(3118):java.lang.RuntimeException:畫布:試圖使用回收的位圖[email protected] 03-03 22:45:34.159 E/AndroidRuntime(3118):\t at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026) 03-03 22:45 :34.159 E/AndroidRuntime(3118):\t在android.graphics.Canvas.drawBitmap(Canvas.java:1127) – Rohith 2013-03-04 13:57:54

0

除了有效地加載位圖之外,我最近還發現確保Android知道它可以在以後發佈圖像也很重要。

其中一個可用的解碼選項是InPurgeable,如果您希望Android從內存中清除任何加載的位圖,將其設置爲true非常重要。

如果設置爲true,則生成的位圖將分配其像素,以便在系統需要回收內存時清除它們。在這種情況下,當像素需要再次訪問(例如位圖繪製,的getPixels()被調用),它們將被自動重新解碼

參見:

+0

我會嘗試這一個,並找出如果我沒有看到內存不足的錯誤。但如果我使用bitmapFactory.DecodeStream,這個選項會有幫助嗎? – Rohith 2013-03-06 04:05:12