安卓性能優(yōu)化

最近看完了《Android開發(fā)藝術(shù)探索》這本書沈跨,這里算是一個筆記幾率,算是加深一遍記憶诀紊,首先是性能優(yōu)化的幾個方法

  • 布局優(yōu)化
  • 繪制優(yōu)化
  • 內(nèi)存泄漏優(yōu)化
  • 響應(yīng)速度優(yōu)化和ANR日志分析
  • ListView和Bitmap優(yōu)化
  • 線程優(yōu)化
  • 一些性能優(yōu)化建議

布局優(yōu)化

優(yōu)化的思路就是盡量減少布局的層數(shù),下面是相應(yīng)的做法

  1. 刪除布局中沒有用的層級和控件隅俘,去掉過度的顏色繪制邻奠。

  2. 盡量少的采用性能較低的ViewGroup,能使用LinearLayout和FrameLayout的情況下不要去使用RelativeLayout(當(dāng)然,是在層級不會增加的時候,如果因為放棄用RelativeLayout而使層級變多的話那就得不償失了

  3. 采用<merge>为居、<include>碌宴,<include>用來引入布局,當(dāng)被引入布局的最外層和引入位置(也就是include所在的父布局)是相同的布局時蒙畴,顯然有一層多余的布局,這時就用<merge>替換掉被引入布局的最外層贰镣。

  4. 采用ViewStub,用ViewStub引入某個布局

       <ViewStub
           android:id="@+id/view_stub_left"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout="@layout/item_translation_left"
           android:inflatedId="@+id/import_layout"/>
    

    其中view_stub_left是ViewStub的id,import_layout是引入布局的根元素id,如果要加載的話可以用setVisibility或者inflate膳凝,ViewStub就會被引入的布局替換掉碑隆,這里要注意的是ViewStub目前還不支持<merge>標(biāo)簽。

  5. 使用ConstraintLayout約束布局蹬音,這是一個為了解決嵌套層數(shù)而設(shè)計出來的布局上煤,用法也很簡單,在可視化界面將控件拖入框內(nèi)著淆,控制各種相對條件劫狠。具體可以看這篇文章拴疤。


繪制優(yōu)化

繪制優(yōu)化主要是注意onDraw方法,因為此方法可能頻繁調(diào)用独泞。所以在此方法里不要做創(chuàng)建對象和耗時任務(wù)的操作呐矾,盡量降低onDraw方法的復(fù)雜度。


內(nèi)存泄漏優(yōu)化

內(nèi)存泄漏在開發(fā)過程中是一個需要重視的問題懦砂,但是由于內(nèi)存泄漏問題對開發(fā)人員的經(jīng)驗和開發(fā)意識有較高的要求蜒犯,因此這也是開發(fā)人員最容易犯的錯誤之一。
想要解決這個問題有兩方面:

  1. 在開發(fā)過程避免寫出有內(nèi)存泄漏的代碼孕惜,下面列舉幾個開發(fā)中要注意的點愧薛。

    1. 頻繁使用不必要的靜態(tài)變量,使用的靜態(tài)對象持有大的引用比如activity衫画。
    2. 單例對象持有activity毫炉,比如單例對象的監(jiān)聽回調(diào)是activity繼承的,注冊監(jiān)聽時把activity傳了進去削罩,如果沒有解注冊這一步瞄勾,那activity就會一直存在,從而導(dǎo)致內(nèi)存泄漏弥激。
    3. 屬性動畫無限循環(huán)的模式下进陡,在onDestory中沒有去停止,此時動畫雖然看不見了微服,但是卻依然在播放趾疚,而且此動畫持有的上下文對象也不會被釋放,從而導(dǎo)致內(nèi)存泄漏以蕴。
    4. 在適用Handler發(fā)送延遲消息時糙麦,在onDestory中沒有清除消息,很多時候丛肮,我們關(guān)閉頁面之后Handler已經(jīng)不需要接收消息了赡磅,但是延遲消息還在隊列里。這個消息包含了Handler的引用宝与。而很多人使用Handler的時候都是匿名類方式焚廊,導(dǎo)致Handler持有當(dāng)前activity對象,因此同樣造成了內(nèi)存泄漏习劫。
  2. 通過分析工具比如LeakCanary咆瘟、BlockCanaryEx來找出內(nèi)存泄漏的點,然后解決诽里。


響應(yīng)速度優(yōu)化以及ANR日志分析

響應(yīng)速度優(yōu)化的思路就是在主線程避免耗時操作搞疗,耗時操作要放到子線程中處理,其實就是異步。這兩個放到一起匿乃,也是因為桩皿,響應(yīng)速度和ANR有關(guān),當(dāng)activity在5秒內(nèi)沒有響應(yīng)時幢炸,或者BroadcastReceiver在10秒內(nèi)未執(zhí)行完操作時也會產(chǎn)生ANR泄隔。

ANR產(chǎn)生以后直接從代碼是很難發(fā)現(xiàn)原因的,要定位問題需要分析一個系統(tǒng)輸出的文件宛徊,系統(tǒng)會在/data/anr目錄下創(chuàng)建一個traces.txt的文件里面有具體產(chǎn)生ANR的原因佛嬉,通過分析該文件就能找到問題所在。


ListView和Bitmap優(yōu)化

ListView的優(yōu)化主要是三點:
1. 采用ViewHolder進行復(fù)用闸天,并且避免在getView里面進行耗時操作
2. 要根據(jù)滑動狀態(tài)控制任務(wù)執(zhí)行的頻率暖呕,滑動快時用戶其實是看不到頁面上的內(nèi)容的,這時高頻率的異步加載其實很沒有必要苞氮。
3. 開啟硬件加速使滑動更流暢湾揽。這里簡單說一下硬件加速到底是干嘛,我們手機里有CPU(中央處理器)和GPU(圖形處理器)兩個處理器笼吟,兩者擅長的計算不同库物,前者主要解釋計算機指令,后者主要是圖形計算贷帮。開啟硬件加速就是將CPU不擅長的圖形計算轉(zhuǎn)換成GPU指令由GPU來完成戚揭。

Bitmap優(yōu)化主要就是通過BitmapFactory.Options來根據(jù)加載需要對圖片進行采樣,避免過度加載撵枢。


線程優(yōu)化

主要思路是避免程序中存在大量線程民晒,具體就是采用線程池來管理線程,避免頻繁創(chuàng)建和銷毀帶來的不必要的消耗锄禽。


一些性能優(yōu)化建議

  • 避免創(chuàng)建過多的對象
  • 不要過多的使用枚舉潜必,枚舉占用的內(nèi)存空間要比整形大
  • 常量請適用static final來修飾
  • 使用一些Android特有的書記結(jié)構(gòu),比如SparseArray和Pair等沟绪,它們都具有更好的性能
  • 適當(dāng)適用軟引用和弱引用
  • 采用內(nèi)存緩存和磁盤緩存
  • 盡量采用靜態(tài)內(nèi)部類刮便,這樣可以避免潛在的由于內(nèi)部類而導(dǎo)致的內(nèi)存泄漏
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空猜,一起剝皮案震驚了整個濱河市绽慈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辈毯,老刑警劉巖坝疼,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谆沃,居然都是意外死亡钝凶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門唁影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耕陷,“玉大人掂名,你說我怎么就攤上這事∮茨” “怎么了饺蔑?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗜诀。 經(jīng)常有香客問我猾警,道長,這世上最難降的妖魔是什么隆敢? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任发皿,我火速辦了婚禮,結(jié)果婚禮上拂蝎,老公的妹妹穿的比我還像新娘穴墅。我一直安慰自己,他們只是感情好匣屡,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布封救。 她就那樣靜靜地躺著,像睡著了一般捣作。 火紅的嫁衣襯著肌膚如雪誉结。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天券躁,我揣著相機與錄音惩坑,去河邊找鬼。 笑死也拜,一個胖子當(dāng)著我的面吹牛以舒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慢哈,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蔓钟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卵贱?” 一聲冷哼從身側(cè)響起滥沫,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎键俱,沒想到半個月后兰绣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡编振,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年缀辩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡臀玄,死狀恐怖瓢阴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情健无,我是刑警寧澤炫掐,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站睬涧,受9級特大地震影響募胃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畦浓,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一痹束、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讶请,春花似錦祷嘶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至风响,卻和暖如春嘉汰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背状勤。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工鞋怀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人持搜。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓密似,卻偏偏與公主長得像,于是被迫代替她去往敵國和親葫盼。 傳聞我的和親對象是個殘疾皇子残腌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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