我使用的是顯示文本和圖像的列表視圖。我正在嘗試使用Task對象異步下載圖像並將它們加載到視圖中以使ListView高效滾動。但是我經常會遇到OutOfMemoryException異常,因爲即使我將它們保存到光盤並訪問它,內存中的Bitmap也有太多。我看到的一個原因是,創建了許多任務(對於20個圖像,創建了20個任務),並且可能會佔用內存。有沒有一種有效的方法來做到這一點?Monodroid有效地加載圖像
這裏是code
我使用的是顯示文本和圖像的列表視圖。我正在嘗試使用Task對象異步下載圖像並將它們加載到視圖中以使ListView高效滾動。但是我經常會遇到OutOfMemoryException異常,因爲即使我將它們保存到光盤並訪問它,內存中的Bitmap也有太多。我看到的一個原因是,創建了許多任務(對於20個圖像,創建了20個任務),並且可能會佔用內存。有沒有一種有效的方法來做到這一點?Monodroid有效地加載圖像
這裏是code
你必須擴展您的位圖,使得他們沒有得到他們的全分辨率爲加載到內存中。內存中的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。
除了有效地加載位圖之外,我最近還發現確保Android知道它可以在以後發佈圖像也很重要。
其中一個可用的解碼選項是InPurgeable
,如果您希望Android從內存中清除任何加載的位圖,將其設置爲true
非常重要。
如果設置爲true,則生成的位圖將分配其像素,以便在系統需要回收內存時清除它們。在這種情況下,當像素需要再次訪問(例如位圖繪製,的getPixels()被調用),它們將被自動重新解碼
參見:
我會嘗試這一個,並找出如果我沒有看到內存不足的錯誤。但如果我使用bitmapFactory.DecodeStream,這個選項會有幫助嗎? – Rohith 2013-03-06 04:05:12
感謝Cheesebaron,我記得之前嘗試過,也只是嘗試過。我沒有看到內存錯誤,但我也沒有看到視圖上的圖像! – Rohith 2013-03-04 13:34:36
另外,當我試圖做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