在Android開(kāi)發(fā)中,特別是一些圖片數(shù)量特別大特別多的項(xiàng)目中,經(jīng)常會(huì)遇到OOM也就是OutOfMemoryError,那么我們?cè)趯?shí)際的android開(kāi)發(fā)內(nèi)存優(yōu)化中如何有效避免oom呢?
一.上面說(shuō)到圖片多的應(yīng)用容易發(fā)生oom,這里就要提到一個(gè)內(nèi)存優(yōu)化必須提到的吃?xún)?nèi)存的大胖子bitmap,通常我們?cè)陂_(kāi)發(fā)中通過(guò)下面兩種方式來(lái)優(yōu)化
1.在圖片載入內(nèi)存之前計(jì)算合適的縮放比例,避免大圖的載入浪費(fèi)內(nèi)存
2.使用更加節(jié)省內(nèi)存的解碼方式,ARGB_8888比RBG_565所需的內(nèi)存要大一倍
3.bitmap要及時(shí)回收
二.在數(shù)據(jù)結(jié)構(gòu)上
1.減少內(nèi)存的開(kāi)銷(xiāo)要盡量使用更加輕量型的數(shù)據(jù)結(jié)構(gòu),我們要優(yōu)先考慮android專(zhuān)用的ArrayMap和SparseArray數(shù)據(jù)結(jié)構(gòu)而不是HashMap等傳統(tǒng)型的數(shù)據(jù)結(jié)構(gòu),傳統(tǒng)型數(shù)據(jù)結(jié)構(gòu)效率低下更占內(nèi)存
2.在android開(kāi)發(fā)中要避免使用Enum,也就是枚舉
3.在字符串拼接中盡量使用StringBuilder而不是"+"
三.在向res里添加圖片資源時(shí),尺寸,大小,清晰度都要考慮,力爭(zhēng)適合的尺寸,小的占存好的清晰度
四.直接引用android本身內(nèi)置的資源
Android系統(tǒng)本身內(nèi)置了很多的資源,例如字符串/顏色/圖片/動(dòng)畫(huà)/樣式以及簡(jiǎn)單布局等等,這些資源都可以在應(yīng)用程序中直接引用。這樣做不僅僅可以減少應(yīng)用程序的自身負(fù)重,減小APK的大小,另外還可以一定程度上減少內(nèi)存的開(kāi)銷(xiāo),復(fù)用性更好。但是也有必要留意Android系統(tǒng)的版本差異性,對(duì)那些不同系統(tǒng)版本上表現(xiàn)存在很大差異,不符合需求的情況,還是需要應(yīng)用程序自身內(nèi)置進(jìn)去。
五.列表控件的使用
列表控件的使用優(yōu)化listview,gridview,recyclerview等 使用viewholder對(duì)convertview的復(fù)用等
六.避免對(duì)象的內(nèi)存泄漏
使用leakcanary等第三方開(kāi)源控件對(duì)APP內(nèi)存泄漏的檢測(cè)
1.能使用application的context就不要使用activity的context,可以避免activity不能釋放而導(dǎo)致的泄漏
2.webview的泄漏問(wèn)題在android比較嚴(yán)重,因?yàn)樗槠瘒?yán)重,不同版本不同廠家的webview都有差別,這里提供一個(gè)解決webview泄漏的方案//www.jianshu.com/p/bb778d5959e2
3.操作數(shù)據(jù)庫(kù)時(shí)會(huì)用到cursor對(duì)象,cursor對(duì)象一定要及時(shí)關(guān)閉否則會(huì)泄露
七.優(yōu)化布局層次
優(yōu)化布局層次,減少內(nèi)存消耗,越扁平化的視圖布局,占用的內(nèi)存就越少,效率越高。我們需要盡量保證布局足夠扁平化,當(dāng)使用系統(tǒng)提供的View無(wú)法實(shí)現(xiàn)足夠扁平的時(shí)候考慮使用自定義View來(lái)達(dá)到目的。
八.謹(jǐn)慎使用依賴(lài)注入框架和第三方library,這些都會(huì)增大內(nèi)存的消耗
熱點(diǎn)新聞
課程問(wèn)答