我試圖更好地理解Android如何處理圖像以更高效地使用內存。我有一個存儲在Bitmap
中的圖像,我正在使用ImageView.setImageBitmap()
來顯示它。現在的問題是 - 它會使用我未來通過它的Bitmap
,還是正在複製它,我創建的Bitmap
在撥打setImageBitmap
後不再使用?Android ImageView setImageBitmap
Asuming它會繼續參考Bitmap
我已經通過,當Bitmap
是通過BitmapFactory
使用inPurgeable
選項創建的時,它將如何表現?將ImageView
阻止Bitmap
暫時從內存中清除?難道只有當ImageView
有View.VISIBLE
狀態,還有View.GONE
和View.INVISIBLE
?或者,也許只有在屏幕上可見ImageView
?
還有一件事 - 通過Android源代碼查看顯示編碼的字節數據總是被複制到內存中(inInputShareable
目前被忽略)。它是否計入了Android Java應用程序的16/24MB內存限制?
感謝
我想你可以通過簡單的實驗回答大家的一些問題。我會說你傳遞給setImageBitmap()的位圖是直接使用的。而且,無論視圖是否消失,如果它指向它,它將永遠不會被垃圾收集器破壞。 Pozdro;) – Yar
不幸的是,它並不那麼簡單。即使ImageView保留對傳遞位圖的引用,也不意味着存儲在位圖中的數據不能被清除。根據文檔,「如果系統需要回收內存,則結果位圖將分配其像素以清除它們」,「當像素需要再次訪問(..)時,它們將自動重新解碼」。我詢問的是ImageView是否會阻止解碼數據被清除,或者在需要時清除並重新解碼。找到答案並不容易,它的行爲可能取決於幾個因素。 –
「,當像素需要再次訪問(..)時,它們將被自動重新解碼」 - 如果ImageView已經被設置爲原始位圖,創建運行時,沒有任何信息從何處獲取,該怎麼辦?如果那是真的,它將永遠消失。我不這麼認爲。 – Yar