問題描述
通過一個ViewPager加載圖片,每個ItemView里面有一個ImageView和一個ProgressBar立倍。當(dāng)調(diào)用instantiateItem
的時候,會啟動一個AsyncTask去下載圖片并顯示侣滩。但是不斷地滑動圖片口注,大概二三十張的時候就會崩潰,報OOM錯誤君珠。
解決思路
由于每當(dāng)調(diào)用instantiateItem
的時候寝志,我都會重新inflate一個新的View,然后保存在數(shù)組里面。在destroyItem
方法里面去調(diào)用container.remove()方法材部,但是由于View的引用仍然保存在數(shù)組里面毫缆,所以View就無法得到回收,所以在remove的時候乐导,也同時將數(shù)組相應(yīng)的元素設(shè)為了null
苦丁。在AsyncTask里面也有ImageView和ProgressBar的引用,可能造成了內(nèi)存泄露物臂。后來就改為了WeakReference去保存ImageView旺拉。
但是問題依然沒有解決,然后繼續(xù)想辦法棵磷,想到了圖片里面的bitmap可能要手動釋放蛾狗,就在destroyItem的時候,手動將ImageView的bitmap進(jìn)行釋放仪媒,調(diào)用了bitmap的recycle方法沉桌。
后來發(fā)現(xiàn)情況有所好轉(zhuǎn),但是滑多了還是會有問題规丽。
就想到了ViewPager其實不需要一直inflate View蒲牧,可以在初始化ViewPager的時候就inflate幾個View,我是創(chuàng)建了4個View赌莺,然后之后的滑動就一直重復(fù)利用這4個View,通過取模運算松嘶,使用相應(yīng)的View艘狭,果然就內(nèi)存就上升的很慢,而且上升上去之后也能通過GC降下來翠订。