Android開發經驗分享(5)Android最佳化小結

來源:互聯網
上載者:User

標籤:des   android   color   io   使用   java   strong   資料   sp   

項目中何時不會用到最佳化呢,現把一些最佳化的小經驗總結下

 

1、萬惡的static

static是個好東西,聲明賦值調用就是那麼的簡單方便,但是伴隨而來的還有效能問題。由於static聲明變數的生命週期其實是和APP的生命週期一樣的,有點類似與Application。如果大量的使用的話,就會佔據記憶體空間不釋放,積少成多也會造成記憶體的不斷開銷,直至掛掉。static的合理使用一般用來修飾基礎資料型別 (Elementary Data Type)或者輕量級對象,盡量避免修複集合或者大對象,常用作修飾全域配置項、工具類方法、內部類。

2、無關引用

很多情況下,我們需求用到傳遞引用,但是我們無法確保引用傳遞出去後能否及時的回收。比如比較有代表性的Context泄漏,很多情況下當Activity 結束掉後,由於仍被其他的對象指嚮導致一直遲遲不能回收,這就造成了記憶體流失。這時可以考慮第三條建議。

3、善用SoftReference/WeakReference/LruCache

Java、Android中有沒有這樣一種機制呢,當記憶體吃緊或者GC掃過的情況下,就能及時把一些記憶體佔用給釋放掉,從而分配給需要分配的地方。答案是肯定的,java為我們提供了兩個解決方案。如果對記憶體的開銷比較關注的APP,可以考慮使用WeakReference,當GC回收掃過這塊記憶體地區時就會回收;如果不是那麼關注的話,可以使用SoftReference,它會在記憶體申請不足的情況下自動釋放,同樣也能解決OOM問題。同時Android自3.0以後也推出了LruCache類,使用LRU演算法就釋放記憶體,一樣的能解決OOM,如果相容3.0一下的版本,請匯入v4包。關於第二條的無關引用的問題,我們傳參可以考慮使用WeakReference封裝一下。

4、謹慎handler

在處理非同步作業的時候,handler + thread是個不錯的選擇。但是相信在使用handler的時候,大家都會遇到警告的情形,這個就是lint為開發人員的提醒。handler運行於UI線程,不斷處理來自MessageQueue的訊息,如果handler還有訊息需要處理但是Activity頁面已經結束的情況下,Activity的引用其實並不會被回收,這就造成了記憶體流失。解決方案,一是在Activity的onDestroy方法中調用

handler.removeCallbacksAndMessages(null);取消所有的訊息的處理,包括待處理的訊息;二是聲明handler的內部類為static。

5、Bitmap終極殺手

Bitmap的不當處理極可能造成OOM,絕大多數情況都是因這個原因出現的。Bitamp位元影像是Android中當之無愧的胖小子,所以在操作的時候當然是十分的小心了。由於Dalivk並不會主動的去回收,需要開發人員在Bitmap不被使用的時候recycle掉。使用的過程中,及時釋放是非常重要的。同時如果需求允許,也可以去BItmap進行一定的縮放,通過BitmapFactory.Options的inSampleSize屬性進行控制。如果僅僅只想獲得Bitmap的屬性,其實並不需要根據BItmap的像素去分配記憶體,只需在解析讀取Bmp的時候使用BitmapFactory.Options的inJustDecodeBounds屬性。最後建議大家在載入網狀圖片的時候,使用軟引用或者弱引用並進行本機快取,推薦使用android-universal-imageloader或者xUtils,牛人出品,必屬精品。前幾天在講《自訂控制項(三)  繼承控制項》的時候,也整理一個,大家可以去Github下載看看。

6、Cursor及時關閉

在查詢SQLite資料庫時,會返回一個Cursor,當查詢完畢後,及時關閉,這樣就可以把查詢的結果集及時給回收掉。

7、頁面背景和圖片載入

在布局和代碼中設定背景和圖片的時候,如果是純色,盡量使用color;如果是規則圖形,盡量使用shape畫圖;如果稍微複雜點,可以使用9patch圖;如果不能使用9patch的情況下,針對幾種主流解析度的機型進行切圖。

8、ListView和GridView的item緩衝

對於行動裝置,尤其硬體參差不齊的android生態,頁面的繪製其實是很耗時的,findViewById也是蠻慢的。所以不重用View,在有列表的時候就尤為顯著了,經常會出現滑動很卡的現象。具體參照曆史文章《說說ViewHolder的另一種寫法》

9、BroadCastReceiver、Service

綁定廣播和服務,一定要記得在不需要的時候給解除綁定。

10、I/O流

I/O流操作完畢,讀寫結束,記得關閉。

11、線程

線程不再需要繼續執行的時候要記得及時關閉,開啟線程數量不易過多,一般和自己機器核心數一樣最好,推薦開啟線程的時候,使用線程池。

12、String/StringBuilder

當有較多的字元創需要拼接的時候,推薦使用StringBuilder。

Android開發經驗分享(5)Android最佳化小結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.