使用ViwePager顯示圖片時如何防止記憶體洩露。
記憶體洩露的檢測。
1. 在Android Studio中執行你的應用,然後切換到輸出視窗的Android tab。
2. 盡情的玩耍你的應用,最好各個功能都用到,如果是Viewpager,則多滑動一些頁面,觀察記憶體的增長情況。
如果是下面這樣大致平穩的曲線,就沒有記憶體洩露。
如果是下面這樣,階梯狀的曲線,基本是有記憶體洩露了。圖片右上角顯示已經分配了178.16M,一旦這個數字超過200M,程式就會崩掉。
如果得知哪些函式耗費了大量記憶體呢?可以記錄記憶體的使用過程,加以分析,點選記憶體視窗的Start Allocation Tracking按鈕開始記錄,使用完再次點選停止記錄。
在彈出的記錄檔案中可以找到使用記憶體較多的函式呼叫。這個方法瀏覽記憶體使用的情況,不能確定記憶體洩露的地方。
一點經驗:
用FragmentStatePagerAdapter代替FragmentPagerAdapter
前者保證不再顯示的頁面(Off-Screen page)能夠被及時刪除,釋放掉記憶體,但是bitmap記憶體不再此列。
減小bitmap尺寸
使用bitmap是要儘量使用小尺寸的,因為Android中一個bitmap佔多大記憶體是由其尺寸決定的,而不是其所佔硬碟空間的大小決定的。比如一個512 * 512的色彩斑斕的圖片,一個1024 * 1024的黑白圖片,前者所佔硬碟空間更大,但是載入到Android中,後者所用記憶體確是前者的四倍!因為Android是按 1024 * 1024來分配記憶體,它不管你畫素是什麼樣色。
使用完的bitmap要及時回收記憶體。
bitmap = null是一句很有用的程式碼。這樣可以不再引用某個物件,加快垃圾回收的程序。
ImageView.setImageDrawable(null)也是脫離對之前設定的點陣圖的引用。急速垃圾回收。
上面這兩句放到Activity或者Fragment的onDestroy方法中,有奇效!
小心使用AsyncTask進行非同步載入
記得在Activity或者Fragment的onDestroy方法中將AsyncTask的例項置空。否則裡面引用的Bitmap記憶體無法釋放!
如果使用ASyncTask匿名物件則可忽略此條。
==