一.代碼優化
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()等
使用弱引用