Android內存管理-SoftReference的使用
如果細心的網友可能發現Android Market客戶端載入時,每個列表項的圖標是異步刷新顯示的,但當我們快速的往下滾動到一定數量比如50個,再往回滾動時可能我們看到了部分App的圖標又重新開始加載,當然這一過程可能是從SQLite數據庫中緩存的,但是在內存中已經通過類似SoftReference的方式管理內存。
在Java中內存管理,引用分爲四大類,強引用HardReference、弱引用WeakReference、軟引用SoftReference和虛引用PhantomReference。它們的區別也很明顯,HardReference對象是即使虛擬機內存吃緊拋出OOM也不會導致這一引用的對象被回收,而WeakReference等更適合於一些數量不多,但體積稍微龐大的對象,在這四個引用中,它是最容易被垃圾回收的,而我們對於顯示類似Android Market中每個應用的App Icon時可以考慮使用SoftReference來解決內存不至於快速回收,同時當內存短缺面臨Java VM崩潰拋出OOM前時,軟引用將會強制回收內存,最後的虛引用一般沒有實際意義,僅僅觀察GC的活動狀態,對於測試比較實用同時必須和ReferenceQueue一起使用。
對於一組數據,我們可以通過HashMap的方式來添加一組SoftReference對象來臨時保留一些數據,同時對於需要反覆通過網絡獲取的不經常改變的內容,可以通過本地的文件系統或數據庫來存儲緩存,希望給國內做App Store這樣的客戶端一些改進建議。