2010-12-15 22 views
0

當顯示一個包含大量位圖(全屏,wvga)的圖庫時,我經常遇到內存不足的問題。我認爲這與位圖不被回收有關。何時/如何強制位圖被回收?何時安全/可以在Android SimpleCursorAdapter中使用Gallery視圖回收位圖?

我還注意到,在simpleCursorAdapter的getView方法中,convertView始終爲null。我認爲這意味着舊視圖不會被回收?即使滾動來回,每次都會創建一個新視圖。但是,來回滾動不會導致內存不足問題,只有在圖像總數足夠大時纔會發生。

與ListView一起使用同一個適配器時,視圖被回收,所以看起來問題在於Gallery。

我能做些什麼來強制視圖和/或位圖被回收?我還能做什麼來管理內存,而不會降低圖庫大小和位圖質量。

+0

您是否嘗試過像'purgeable'這樣的各種位圖選項 - 您是否在圖庫中使用了預縮放或高質量圖像?你見過'SoftReference' /'WeakReference'用於內存管理嗎? – 2010-12-15 13:56:06

回答

-2

您從不需要需要來回收Bitmap。但是,你可以做到這一點,它會幫助你有OutOfMemory錯誤。但不要它,直到不需要位圖的比較多,因爲(Javadoc中)

它會拋出一個異常,如果 getPixels()setPixels()是 調用,將借鑑什麼。這個 操作不能被顛倒過來,所以它只能在你確定 位圖沒有進一步用途的情況下調用 。

在你的情況,我想你應該:這是位圖BitmapFactory.Options.inSampleSizeMediaStore.Images.Thumbnails打開

  • 使用大拇指
  • 在內存中最多隻有一個全尺寸的位圖(也許有你預裝可以承受)
+1

對,你不需要*,但是如果你不這樣做,你的應用程序會崩潰。你究竟如何定義「需要」? – 2011-04-22 21:54:51

+0

谷歌對「需求」的定義不同。您必須在HC之前回收位圖。 – Raz 2012-03-14 13:50:26

0

如果您確定tou不再使用位圖,例如任何使用臨時位圖的操作,則可以使用recycle()。但是...您可以使用BitmapFactory.Options,例如:

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
bitmapOptions.inPurgeable=true; 

Bitmap bitmapTemp = BitmapFactory.decodeResource(getResources(), R.drawable.intro, bitmapOptions); 

它做什麼?可選項inPurgeable會假設一旦系統需要內存並且你的位圖沒有用處,系統將自行回收這個內存分配。如果由於某種原因你不能使用BitmapFactory加載圖像,那麼你可以使用Recycle(),並且建議使用system.gc()來調用de garbage collector,如果你正在開發一個遊戲,這是有用的,因爲當垃圾收集器在系統內存不足時被激活,它將消耗一些有價值的毫秒。 你應該非常小心位圖,它們不會存儲在應用程序使用的「普通」內存中,除非您使用的是Android 3.0,否則它將存儲在所有應用程序使用的「常規」內存中。 如果您發現內存泄漏,並且無法在堆中找到它,那麼您應該查看代碼加載和位圖。 希望它有幫助。

相關問題