Android 性能典范:拯救計(jì)劃

前言

今天逛稀土?xí)r偶然看到hanks分享的一篇英文文章,粗略瀏覽便已覺(jué)得不錯(cuò)鼻忠,因此翻譯成中文,與君分享。

原文地址:Android Performance Patterns: Rescue tips

正文

現(xiàn)在的app到處都充斥著華麗的動(dòng)畫粘捎、復(fù)雜的轉(zhuǎn)化還有自定義View,然而用戶體驗(yàn)必須盡可能直觀且類似危彩。以下這些范例將會(huì)幫助你做出一個(gè)流暢的攒磨、快速響應(yīng)的、甚至可能減少電量損耗的app恬砂,這些范例由一些可以提升整體應(yīng)用表現(xiàn)的微優(yōu)化組成咧纠。

避免“壞”表現(xiàn)

  • 避免堵塞主線程
  • 避免可能引發(fā)大范圍重繪的不必要的重繪
  • RelativeLayout 來(lái)減少布局層級(jí)
  • 避免在 LinearLayout 中使用嵌套的 weight 屬性(因?yàn)閣eight屬性會(huì)使每個(gè)子View進(jìn)行兩次measure)
  • 避免使用沒(méi)有恰當(dāng)處理的自定義View
  • 避免創(chuàng)建沒(méi)必要的對(duì)象
  • 將常量聲明為 static final(static比普通變量快 15% - 20%)
  • 使用基本數(shù)據(jù)類型(Integer、Float 比基本類型慢兩倍)
  • 避免內(nèi)部的 gettersetter(直接訪問(wèn)屬性可以快3倍)
  • 使用改進(jìn)的循環(huán)語(yǔ)法【譯者注:這里應(yīng)該是指for each循環(huán)】
  • 對(duì)私有的內(nèi)部類考慮使用包訪問(wèn)級(jí)別代替私有訪問(wèn)級(jí)別
  • 謹(jǐn)慎使用native方法

自定義View

  • 遵循KISS原則
  • 在布局中使用merge標(biāo)簽來(lái)作為根標(biāo)簽(避免額外的ViewGroup
  • 使用include標(biāo)簽(便于布局的復(fù)用)
  • 避免不必要的布局
  • 不要在onDraw中申請(qǐng)內(nèi)存或者做復(fù)雜邏輯
  • 去除不必要的invalidate()調(diào)用
  • 考慮創(chuàng)建自己的ViewGroup
  • RecyclerView替代ListViewGridView

避免內(nèi)存抖動(dòng)

  • 不要申請(qǐng)大量不必要的對(duì)象內(nèi)存:
    1, 不可變對(duì)象:String
    2, 自動(dòng)裝箱:Integer, Boolean...
  • 考慮使用對(duì)象池并緩存來(lái)減少內(nèi)存抖動(dòng)
  • 留心enum類型的開(kāi)銷(一個(gè)指向枚舉類型的引用就要占據(jù)4個(gè)字節(jié))

避免內(nèi)存泄漏

  • 不要在內(nèi)部類里泄漏context實(shí)例
  • 不要在activity里泄漏view實(shí)例
  • 使用內(nèi)部靜態(tài)類優(yōu)于非靜態(tài)的
  • 除非鍵都是WeakReference泻骤,否則不要使用WeakHashmap作為緩存

CPU

  • 不要嵌套多通路布局
  • 當(dāng)需要時(shí)才去進(jìn)行復(fù)雜的計(jì)算【譯者注:類似懶加載】
  • 緩存復(fù)雜計(jì)算的結(jié)果以復(fù)用
  • 考慮 RenderScript 的性能
  • 盡可能減少主線程的工作

避免過(guò)度繪制

  • 精簡(jiǎn)drawable
  • 在透明部分使用.9圖
  • 設(shè)置view的透明度時(shí)多注意
  • 去除view中無(wú)用的背景

bitmap

  • 將bitmap解碼為需要的尺寸:BitmapFactory.Options( inSampleSize, inDensity, inTargetDensity)
  • 加載bitmap到內(nèi)存時(shí)漆羔,設(shè)置尺寸為顯示尺寸
  • 如無(wú)必要不要進(jìn)行縮放
  • 使用LRU緩存

Service

  • 除非Service在處理事務(wù)否則不要讓其保持運(yùn)行。同時(shí)也要小心stopService當(dāng)Service工作完成時(shí)
  • 系統(tǒng)傾向保留有Service運(yùn)行的進(jìn)程狱掂,那么被service占用的內(nèi)存將無(wú)法被其他進(jìn)程使用或者被內(nèi)存置換
  • 限制service生命周期的最佳實(shí)踐是使用IntentService演痒,它會(huì)在工作完成后結(jié)束自身
  • 讓沒(méi)必要存活的Service繼續(xù)運(yùn)行是Android app內(nèi)存管理最差的舉動(dòng)之一

線程

  • 在線程的run()方法中使用 Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND)可以減少該線程及UI線程的計(jì)算性能損耗
  • 如果你沒(méi)有通過(guò)這種方式為線程設(shè)置低優(yōu)先級(jí),那么該線程仍會(huì)拖慢你的app趋惨,因?yàn)槟J(rèn)情況下它的優(yōu)先級(jí)與UI線程的優(yōu)先級(jí)相同
  • 維護(hù)住當(dāng)前線程的引用鸟顺,以便你之后可能先打斷該線程。例如:當(dāng)網(wǎng)絡(luò)連接失敗你可以取消該線程

避免ANR

  • UI線程中做的事越少越好
  • 如果應(yīng)用正在后臺(tái)響應(yīng)用戶的輸入器虾,最好顯示進(jìn)度給用戶(例如顯示一個(gè)進(jìn)度條)
  • 使用SystraceTraceview等性能工具來(lái)檢測(cè)應(yīng)用響應(yīng)能力的瓶頸
  • 如果你的應(yīng)用有一個(gè)非常耗時(shí)的初始化過(guò)程讯嫂,考慮使用啟動(dòng)頁(yè)或者盡快渲染主要的view,表明正在加載中并且正在顯示異步的信息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兆沙,一起剝皮案震驚了整個(gè)濱河市欧芽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葛圃,老刑警劉巖千扔,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憎妙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡曲楚,警方通過(guò)查閱死者的電腦和手機(jī)厘唾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)龙誊,“玉大人抚垃,你說(shuō)我怎么就攤上這事≡仄” “怎么了讯柔?”我有些...
    開(kāi)封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)护昧。 經(jīng)常有香客問(wèn)我魂迄,道長(zhǎng),這世上最難降的妖魔是什么惋耙? 我笑而不...
    開(kāi)封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任捣炬,我火速辦了婚禮,結(jié)果婚禮上绽榛,老公的妹妹穿的比我還像新娘湿酸。我一直安慰自己,他們只是感情好灭美,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布推溃。 她就那樣靜靜地躺著,像睡著了一般届腐。 火紅的嫁衣襯著肌膚如雪铁坎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天犁苏,我揣著相機(jī)與錄音硬萍,去河邊找鬼。 笑死围详,一個(gè)胖子當(dāng)著我的面吹牛朴乖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播助赞,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼买羞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雹食?” 一聲冷哼從身側(cè)響起哩都,我...
    開(kāi)封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婉徘,沒(méi)想到半個(gè)月后漠嵌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盖呼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年儒鹿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几晤。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡约炎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟹瘾,到底是詐尸還是另有隱情圾浅,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布憾朴,位于F島的核電站狸捕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏众雷。R本人自食惡果不足惜灸拍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾省。 院中可真熱鬧鸡岗,春花似錦、人聲如沸编兄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狠鸳。三九已至揣苏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碰煌,已是汗流浹背舒岸。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芦圾,地道東北人蛾派。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像个少,于是被迫代替她去往敵國(guó)和親洪乍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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