Android性能優化之代碼優化

一.代碼優化

1.廣播

應用程序內部廣播通信,優先采用LocalBroadcastManager,安全性更好,運行效率更高。

優勢:平時常說BroadcastReceiver,采用的是Binder通信方式,這是跨進程的通信方式,系統資源消耗固然更多。而廣播LocalBroadcastManager,采用的是Handler通信機制,Handler的實現是應用內的通信方式,所以效率與安全性都更高。

注冊廣播:

注:LocalBroadcastManager只能通過代碼的方式注冊

2.線程池

線程創建優先采用線程池ThreadPoolExecutor,而不是new Thread(); 另外設置線程優先級為后臺運行優先級,能有效減少Runnable創建的線程和和UI線程之間的資源競爭。

優勢:通過new Thread()來創建線程是比較常用的方式,而使用線程池的方式有不少優勢如下

線程可重復利用,節省線程的創建與銷毀開銷,性能有所提升;

方便控制并發線程數,提高資源的利用率,減少過多的資源競爭;

用法:

系統創建線程池采用的事工廠模式

(1) newCachedThreadPool可緩存線程池,若線程空閑60s則回收,若無空閑線程可無限創建新線程

(2) newFixedThreadPool定長線程,固定線程池大小

(3) newSingleThreadExecutor只有一個線程的線程池

(4) newScheduledThreadPool可定時周期執行的線程池

3.ArrayList VS LinkedList

ArrayList基于動態數組的數據結構, 對于隨機訪問(get/set),ArrayList效率比LinkedList高; LinkedList基于鏈表的數據結構,對于新增和刪除(add/remove),LinedList效率比ArrayList高;

(1)對于list, 優先選擇ArrayList,除非少數需要大量的插入/刪除操作才使用LinkedList。因為當數據量非常大時get操作,LinkedList時間復雜度為o(n), 而ArrayList時間復雜度為o(1)。

(2)循環遍歷

LinkedList采用foreach方式, 效率最高。for循環方式效率大幅度降低

(3)采用new ArrayList()方式,初始大小為0,首次增加數組時,擴充大小到12,以后到數組需要增長時,會將大小增加50%,并將原來的成員全部復制到新的數組內。所以盡可能將ArrayList提前設置成目標大小,或者接近目標大小,以減少數組不斷創建與復制的過程,提高效率。

4.HashMap VS SparseArray

(1)同時需要key和value,采用如下遍歷方法

(2)只需要獲取key,采用如下遍歷方法

15.BitMap

(1)使用BitmapFactory.Options對圖片進行縮略讀取;減小內存使用量;

inSampleSize:縮放比例,在把圖片載入內存之前,先計算出一個合適的縮 ? ? ? ? 放比例,避免不必要的大圖載入

decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,能減小內存空間

使用SoftReference:當內存不足時,虛擬機會自動回收它;

使用Bitmap.recycle()釋放圖片,虛擬機gc時回收Bitmap;

根據手機尺寸大小,配置不同大小的圖片,保證使用盡可能小的圖片資源。

6.Android避免使用枚舉

Enum比靜態常量,至少需要多過于2倍以上的內存空間,應該在Android中避免使用枚舉

7.onDraw()

需避免對象創建操作,因為迅速增加內存,同樣引起頻繁的gc,甚至內存抖動。

其他

內部類引用導致Activity的泄漏,尤其是Handler

監聽器即使注銷

考慮使用Application Context而不是Activity Context

使用IntentService

Adapter 利用convertView.getTag()與 ViewHolder

窗口默認有一個不透明的背景,可以去掉的: getWindow().setBackground(null),或者修改xml

UI局部刷新

在性能敏感的代碼,避免創建Java對象。比如onMeasure(), onLayout(), onDraw(), getView()等

使用弱引用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容