2011-07-16 65 views
2

我正在繪製高度和寬度等於設備屏幕的圖像作爲Android中的重疊項。但是,當圖像數量超過應用程序崩潰時出現內存不足錯誤 - 位圖超出虛擬機預算。如果我嘗試回收它,那麼錯誤就像試圖使用回收位圖的畫布一樣。我需要的是在地圖上繪製大量圖像的最佳方式。圖像來自服務器,我也需要緩存圖像。爲了緩存目前我在LinkedHashMap中這樣做,但我想即使這將創建問題,因爲我存儲可繪製對象。內存不足錯誤 - 在地圖中使用位圖時,位圖超出了Android中的虛擬機預算?

有沒有使用在地圖上繪製大型位圖的任何示例?

回答

0

每個應用程序的內存量都非常有限(通常爲16MB,但我看到的最低只有14MB,最高可達32MB)。這是特定於每個設備上運行的固件。應用程序類可以繼承以提供對「LowMemory」函數的訪問,該函數可以在您的應用程序使用幾乎所有內存時提醒您。

你不應該對圖像大小的屏幕有問題,但要確保它們沒有可笑的過大(讓它們儘可能小)。我還建議在Eclipse中檢查內存統計信息,看看你的應用程序使用了多少內存(看看它如何增長等)。

此錯誤是與地圖和Android打交道,你會發現很多關於這裏這個問題其他職位上時最討厭的錯誤之一SO

+0

是的,我找到了相關的問題。我也嘗試過回收,但這不適合我,因爲我說它在畫布試圖使用recylced位圖時報告另一個錯誤。 – sunil

+0

我相信回收處理圖像使用的內存,所以如果你回收它,你需要從疊加層中刪除圖形。你繪製了多少疊加層?每個圖像有多大(圖像和字節)?您的應用程序在其他位置是否使用了大量內存(例如,DOM解析器真的是內存密集型)? – Kurru

+0

圖像將等於設備屏幕的寬度和高度。大小約爲5kb t0 8kb。我不使用DOM解析器,但只解析JSON響應。 – sunil

2

你可能要考慮使用BitmapFactory.OptionsinSampleSize財產類。該屬性將在創建位圖對象時通過2的冪(您決定)重新調整圖像大小,這將節省內存。如果圖片的分辨率大於屏幕的分辨率,那麼這對您而言應該很好,而不會降低圖片的質量。

要使用此爲您從服務器下載的圖像,你可以按如下方式使用它:

URL url = new URL(photoUrl); 
URLConnection ucon = url.openConnection(); 

Options options = new Options(); 
options.inSampleSize = 2; 

Bitmap bitmap = BitmapFactory.decodeStream(ucon.getInputStream(),null, options); 

另一種方法是還包每個位圖對象在你的HashMap與SoftReference對象,以便VM將回收位圖使用的內存,而不是因OOM錯誤而崩潰。缺點是你將不得不重新加載位圖和個人,我覺得回收內存時虛擬機是積極的。它很快恢復內存。

相關問題