首先,確保你沒有加載比所需的更大的位圖:
Load a Scaled Down Version into Memory。
然後,嘗試largeHeap
之前,儘量釋放內存很快自己:
如果你只要你確信你不會再使用位圖,然後大頭調用bitmap.recycle();
位圖的內存將爲立即釋放。 (當GC接近它時,剩下的只是一個小物件。)
在較新的Android版本,有替代品(而不是recycle
),可能是更有效的:
Managing Bitmap Memory
就個人而言,我還是用recycle
時候,尤其是當我可能會加載不同大小的圖像,所以不能reuse
現有的。另外,我發現在更換不同片段或活動時,舊媒體的「卸載」與新媒體的「加載」分開更容易:
由於離開舊片段,所有舊位圖I recycle
(如果可以訪問從靜態字段設置爲null
)。
根據經驗,是否使用largeHeap
規則,是要考慮它後,你已經嘗試其它方法來減少內存使用。
代碼的應用程序,所以你可以把它再次關閉,仍然運行。
例如,monitor your memory usage和如果內存很緊,請加載「縮小」位圖。如果給定圖像不在其設備的「視網膜」分辨率,用戶是否真的會注意到?
或者,如果它是一個較舊的較慢的設備,largeHeap會讓您的應用程序感覺無響應/生澀?如果是這樣,你可以進一步降低分辨率,或一次顯示較少的位圖?
讓您的應用程序在各種情況下工作,沒有largeHeap
[通過上述技術]。注意:通過分配一些「虛擬」位圖,你可以在緊張的內存上運行「force-test」,並在全局字段中保存對它們的引用,這樣它們就不會被釋放。
現在你可以評估的權衡,因爲它會影響您的應用程序:
當你打開largeHeap
,大量使用你的應用程序 - 是否有地方現在是「較爲低迷」,或動畫「口吃」還是看起來不那麼流暢?請務必在至少一臺舊設備上進行測試,並在一臺高分辨率設備上進行測試。 由於堆較大,您可能會看到較長的GC時間。
或者您可能會得出結論:largeHeap
對您而言效果很好,現在您可以自信地說它是您情況中的最佳選擇。
順便說一句,如果您在確定不再使用位圖時立即調用'bitmap.recycle();',那麼該位圖內存的大部分將立即釋放。 (當GC解決它時,剩下的只是一個小物件。) – ToolmakerSteve