2011-10-29 44 views
2

我試圖更好地理解Android如何處理圖像以更高效地使用內存。我有一個存儲在Bitmap中的圖像,我正在使用ImageView.setImageBitmap()來顯示它。現在的問題是 - 它會使用我未來通過它的Bitmap,還是正在複製它,我創建的Bitmap在撥打setImageBitmap後不再使用?Android ImageView setImageBitmap

Asuming它會繼續參考Bitmap我已經通過,當Bitmap是通過BitmapFactory使用inPurgeable選項創建的時,它將如何表現?將ImageView阻止Bitmap暫時從內存中清除?難道只有當ImageViewView.VISIBLE狀態,還有View.GONEView.INVISIBLE?或者,也許只有在屏幕上可見ImageView

還有一件事 - 通過Android源代碼查看顯示編碼的字節數據總是被複制到內存中(inInputShareable目前被忽略)。它是否計入了Android Java應用程序的16/24MB內存限制?

感謝

+0

我想你可以通過簡單的實驗回答大家的一些問題。我會說你傳遞給setImageBitmap()的位圖是直接使用的。而且,無論視圖是否消失,如果它指向它,它將永遠不會被垃圾收集器破壞。 Pozdro;) – Yar

+0

不幸的是,它並不那麼簡單。即使ImageView保留對傳遞位圖的引用,也不意味着存儲在位圖中的數據不能被清除。根據文檔,「如果系統需要回收內存,則結果位圖將分配其像素以清除它們」,「當像素需要再次訪問(..)時,它們將自動重新解碼」。我詢問的是ImageView是否會阻止解碼數據被清除,或者在需要時清除並重新解碼。找到答案並不容易,它的行爲可能取決於幾個因素。 –

+0

「,當像素需要再次訪問(..)時,它們將被自動重新解碼」 - 如果ImageView已經被設置爲原始位圖,創建運行時,沒有任何信息從何處獲取,該怎麼辦?如果那是真的,它將永遠消失。我不這麼認爲。 – Yar

回答

0

看看這篇文章:http://developer.android.com/training/displaying-bitmaps/index.html

有一些有益的啓示,可以幫助你瞭解Android的內存管理更好

+0

請注意,[僅限鏈接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info),所以SO答案應該是搜索解決方案的終點(而另一個引用停留時間會隨着時間推移而變得過時)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra

+3

最初,我試圖留下評論,而不是像這樣的答案。然而,這個網站對新用戶來說根本不友好,50個聲望只是爲了評論?哎呀 – Rhystic