常見(jiàn)Android內(nèi)存優(yōu)化

1:自定義View

? ? ? 1)耗時(shí)邏輯不能寫(xiě)在onDraw()中。因?yàn)閁I的繪制幀率為每秒60次,也就是說(shuō)每幀的繪制時(shí)間是16毫秒简逮,如果在16毫秒內(nèi)未能完成一幀的繪制,就會(huì)造成丟幀强缘,引起卡頓。

? ? ? ?2)onDraw()中不要定義局部對(duì)象不傅,這是因?yàn)閛nDraw()很可能被頻繁調(diào)用欺旧,這樣短時(shí)間內(nèi)會(huì)產(chǎn)生大量臨時(shí)對(duì)象,這樣不僅會(huì)占用過(guò)多內(nèi)存還會(huì)導(dǎo)致頻繁的GC蛤签,降低程序的執(zhí)行效率

2:過(guò)度繪制辞友。

? ? 1)減少view層級(jí),使用ConstraintLayout震肮,ViewStub称龙,include,merge標(biāo)簽

? ? 2)使用android studio的Layout Inspector工具(替代Hierarchy Viewer)檢查視圖結(jié)構(gòu)

3:耗時(shí)操作戳晌,例如I/O操作鲫尊、數(shù)據(jù)庫(kù)耗時(shí)操作在UI線程中執(zhí)行,針對(duì)I/O耗時(shí)操作沦偎,可以放到異步任務(wù)或者線程池執(zhí)行疫向;數(shù)據(jù)庫(kù)可以創(chuàng)建中間層,利用緩存處理豪嚎,或者多線程處理

4:內(nèi)存抖動(dòng)搔驼,頻繁GC,造成大量對(duì)象的創(chuàng)建和回收侈询,導(dǎo)致堆內(nèi)存碎片化嚴(yán)重舌涨,在分配大內(nèi)存對(duì)象時(shí)容易發(fā)生內(nèi)存泄漏,避免手動(dòng)System.gc().雖 然 有 停 止 復(fù) 制 回 收 算 法 會(huì) 整 理 堆 內(nèi) 存 扔字,但是此算法需要消耗很大的內(nèi)存和時(shí)間

? 案例:因?yàn)榇騆og而進(jìn)行了字符串拼接囊嘉,一旦這個(gè)函數(shù)被比較頻繁地調(diào)用,那么就很有可能會(huì)發(fā)生內(nèi)存抖動(dòng)革为。這里我們新版本已經(jīng)改為使用stringbuilder進(jìn)行優(yōu)化

5:屬性動(dòng)畫(huà)扭粱,無(wú)限循環(huán)的情況,在Activity的onDestroy()中需要調(diào)用animator.cancel();

6:方法深度不易過(guò)大震檩,棧深度過(guò)大就會(huì)導(dǎo)致棧溢出琢蛤。一個(gè)線程的棧深度定義方式有兩種,指定大小和動(dòng)態(tài)申請(qǐng)。指定大信翱椤:如果超過(guò)此大小會(huì)報(bào)棧溢出俩滥。動(dòng)態(tài)申請(qǐng):棧大小不足時(shí)嘉蕾,就會(huì)申請(qǐng)更大深度的棧贺奠。如 果申請(qǐng)的大小超過(guò)了java虛擬機(jī)最大承受范圍,也會(huì)報(bào)棧溢出

7:handler消息未清理

8:內(nèi)部類(lèi)错忱,對(duì)象持有

9:?jiǎn)卫苈剩瑔卫侨值模绻渲谐钟芯哂猩芷诘膶?duì)象以清,就會(huì)導(dǎo)致此對(duì)象不會(huì)被釋放儿普,例如Context持有的是Activity

10:耗時(shí)任務(wù),開(kāi)Thread的掷倔,把Runnable放到線程池中執(zhí)行

11:webview頁(yè)面做獨(dú)立進(jìn)程

12:靜態(tài)代碼塊中不能做耗時(shí)任務(wù)眉孩,類(lèi)加載的初始化階段,執(zhí)行類(lèi)構(gòu)造器方法勒葱,類(lèi)構(gòu)造器中執(zhí)行靜態(tài)成員變量初始化和靜態(tài)代碼塊浪汪,如果做耗時(shí)任務(wù),會(huì)使當(dāng)前線程類(lèi)的加載時(shí)間過(guò)長(zhǎng)凛虽。并且類(lèi)構(gòu)造器執(zhí)行是 ? 線程安全的死遭,假如有多線程訪問(wèn),就會(huì)造成其他線程長(zhǎng)時(shí)間阻塞凯旋。

13:android資源訪問(wèn)未關(guān)閉呀潭,BraodcastReceiver,Cursor至非,IO Stream钠署,退出app時(shí)數(shù)據(jù)庫(kù)未關(guān)閉,Bitmap使用完要手動(dòng)回收

14:ListView荒椭,RecyclerView使用時(shí)ItemView復(fù)用

15:序列化存儲(chǔ)到本地時(shí)用Serializable踏幻;內(nèi)存中的數(shù)據(jù)傳遞,序列化使用Parcelable戳杀,因?yàn)镾erializable在序列化時(shí)會(huì)產(chǎn)生大量臨時(shí)變量该面,引起頻繁的GC

16:第三方庫(kù)的引用,要謹(jǐn)慎信卡,庫(kù)文件打包時(shí)也會(huì)被打包到相應(yīng)的dex中隔缀,dex的加載是在Application的onBaseContext()中,也會(huì)消耗一點(diǎn)加載時(shí)間和內(nèi)存傍菇。如果僅僅為了使用一個(gè)庫(kù)中的一兩個(gè)方法就隨意引入龐大的庫(kù)猾瘸,代價(jià)也是不小的。

17:SVG的使用,項(xiàng)目中配置型icon使用

18:Fragment懶加載和不可見(jiàn)時(shí)定時(shí)回收數(shù)據(jù)

1)Fragment+ViewPager形式牵触,初始化時(shí)如果可見(jiàn)則調(diào)用onCreatView()淮悼,不可見(jiàn)初始化時(shí)onCreatView()則返回一個(gè)空view,等第一次可見(jiàn)再加載view布局

2)母嬰之家的社交模塊揽思,是由三個(gè)Tab組成袜腥,其中帖子Tab全是大圖,處理方法是Fragment不可見(jiàn)2秒后認(rèn)為此頁(yè)面用戶暫時(shí)不操作钉汗,就會(huì)清空Adapter中的數(shù)據(jù)羹令,等再切回到此頁(yè)面時(shí),再重新裝填 內(nèi)存中的數(shù)據(jù)

19:?jiǎn)?dòng)優(yōu)化:

? ? 1)application中onCreate()不能執(zhí)行耗時(shí)操作损痰,否則會(huì)影響SpleshActivity的啟動(dòng)

? ? 2)onPause()中不能執(zhí)行耗時(shí)操作福侈,否則會(huì)延遲被啟動(dòng)頁(yè)面的顯示

20:圖片大圖優(yōu)化

項(xiàng)目中內(nèi)存泄漏檢測(cè)工具用的是LeakCanary,在測(cè)試代碼塊時(shí)可以及時(shí)發(fā)現(xiàn)內(nèi)存泄漏卢未,并且以UI方式顯示肪凛,更為直觀。使用LeakCanary后辽社,項(xiàng)目?jī)?nèi)存有時(shí)還是很客觀伟墙,但一般只發(fā)生在特定階段,此時(shí)可以用Android Profiler查找原因爹袁。項(xiàng)目中例子:

1)OCR身份證圖片使用完未回收远荠,有6MB的優(yōu)化

2)新股列表Adapter中采用單例模式,并持有Activity引用

3)webview獨(dú)立進(jìn)程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末失息,一起剝皮案震驚了整個(gè)濱河市譬淳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盹兢,老刑警劉巖邻梆,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绎秒,居然都是意外死亡浦妄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)见芹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剂娄,“玉大人,你說(shuō)我怎么就攤上這事玄呛≡呐常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵徘铝,是天一觀的道長(zhǎng)耳胎。 經(jīng)常有香客問(wèn)我惯吕,道長(zhǎng),這世上最難降的妖魔是什么怕午? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任废登,我火速辦了婚禮,結(jié)果婚禮上郁惜,老公的妹妹穿的比我還像新娘堡距。我一直安慰自己,他們只是感情好扳炬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布吏颖。 她就那樣靜靜地躺著搔体,像睡著了一般恨樟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疚俱,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天劝术,我揣著相機(jī)與錄音,去河邊找鬼呆奕。 笑死养晋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梁钾。 我是一名探鬼主播绳泉,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姆泻!你這毒婦竟也來(lái)了零酪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拇勃,失蹤者是張志新(化名)和其女友劉穎四苇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體方咆,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡月腋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓣赂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榆骚。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煌集,靈堂內(nèi)的尸體忽然破棺而出妓肢,到底是詐尸還是另有隱情,我是刑警寧澤牙勘,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布职恳,位于F島的核電站所禀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏放钦。R本人自食惡果不足惜色徘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望操禀。 院中可真熱鬧褂策,春花似錦、人聲如沸颓屑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揪惦。三九已至遍搞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間器腋,已是汗流浹背溪猿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纫塌,地道東北人诊县。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像措左,于是被迫代替她去往敵國(guó)和親依痊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 所有知識(shí)點(diǎn)已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)怎披? 在 Jav...
    侯蛋蛋_閱讀 2,450評(píng)論 1 4
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,174評(píng)論 0 2
  • 又是一年秋招季钳枕,哎呀媽呀我被虐的慘來(lái)~這不缴渊,前幾陣失蹤沒(méi)更新博客,其實(shí)是我偷偷把時(shí)間用在復(fù)習(xí)課本了(霧 堅(jiān)持在社區(qū)...
    tengshe789閱讀 2,014評(píng)論 0 8
  • 人生很艱難鱼炒,要每分每秒都浪費(fèi)在值得的人身上衔沼。
    先自沉穩(wěn)x閱讀 129評(píng)論 0 1
  • 正念之心被忘了 上班的一天,電話接個(gè)不停昔瞧,郵件回個(gè)不停指蚁,打開(kāi)手機(jī)又發(fā)現(xiàn)上百條未讀微信,感覺(jué)好累自晰∧回到家里,強(qiáng)拖著疲...
    紅姐criling閱讀 93評(píng)論 0 0