Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak
1. 新建一個android工程,只有一個listview,通過MAT工具查看內(nèi)存情況莫名其妙多了>200K內(nèi)存空間(android4.4 Genymotion)。
hprof文件
2.通過右鍵“List Objects"->"with incoming references"可以查看"byte[281880]"誰使用檐嚣。
with incoming references
3.原來是ListView中的mEdgeGlowBottom和mEdgeGlowTop在使用"byte[281880]"眼滤,查看ListView源碼谜诫,發(fā)現(xiàn)是在AbsListView中定義mEdgeGlowBottom和mEdgeGlowTop锌订,用于overscroll時顯示的效果亡脑。
AbsListView,setOverScrollMode函數(shù)
4.android4.4源碼EdgeEffect類中加載資源R.drawable.overscroll_edge,R.drawable.overscroll_glow僵芹,至此"byte[281880]"的源頭找到了处硬。
android4.4源碼EdgeEffect
5.找到資源源頭,如何去掉"byte[281880]"內(nèi)存占用呢拇派?
1)AbsListView的setOverScrollMode函數(shù)是創(chuàng)建EdgeEffect對象的地方荷辕,只要想辦法把mOverScrollMode設(shè)置為OVER_SCROLL_NEVER。
2)View的構(gòu)造函數(shù)中會調(diào)用setOverScrollMode件豌,所以需要在xml中設(shè)置屬性疮方,之前在代碼中設(shè)置了,結(jié)果無效茧彤。
view構(gòu)造函數(shù)調(diào)用setOverScrollMode
6.配置ListView屬性骡显。
ListView配置overScrollMode="never"
7.至此mGlow bitmap內(nèi)存占用就沒有了。如果不需要overScrollMode效果的話可以去掉曾掂。在android5.0源碼中發(fā)現(xiàn)EdgeEffect實現(xiàn)方式變了惫谤,不是加載Drawable,而是使用Paint進(jìn)行繪制的珠洗。
android5.0源碼EdgeEffect