1.http用gzip壓縮,設置連接超時時間和響應超時時間
http請求按照業務需求,分為是否可以緩存和不可緩存,那么在無網絡的環境中,仍然通過緩存的httpresponse瀏覽部分數據,實現離線閱讀。
2.listview 性能優化
1).復用convertView
在getItemView中,判斷convertView是否為空,如果不為空,可復用。如果couvertview中的view需要添加listerner,代碼一定要在if(convertView==null){}之外。
2).異步加載圖片
item中如果包含有webimage,那么最好異步加載
3).快速滑動時不顯示圖片
當快速滑動列表時(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處於其他兩種狀態(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來
3.使用線程池,分為核心線程池和普通線程池,下載圖片等耗時任務放置在普通線程池,避免耗時任務阻塞線程池后,導致所有異步任務都必須等待
4.異步任務,分為核心任務和普通任務,只有核心任務中出現的系統級錯誤才會報錯,異步任務的ui操作需要判斷原activity是否處於激活狀態
5.盡量避免static成員變量引用資源耗費過多的實例,比如Context
6.使用WeakReference代替強引用,弱引用可以讓您保持對對象的引用,同時允許GC在必要時釋放對象,回收內存。對於那些創建便宜但耗費大量內存的對象,即希望保持該對象,又要在應用程序需要時使用,同時希望GC必要時回收時,可以考慮使用弱引用。
7.超級大胖子Bitmap
及時的銷毀(Activity的onDestroy時,將bitmap回收)
設置一定的采樣率
巧妙的運用軟引用
drawable對應resid的資源,bitmap對應其他資源
8.保證Cursor 占用的內存被及時的釋放掉,而不是等待GC來處理。並且 Android明顯是傾向於編 程者手動的將Cursor close掉
9.線程也是造成內存泄露的一個重要的源頭。線程產生內存泄露的主要原因在於線程 生命周期的不可控
10.如果ImageView的圖片是來自網絡,進行異步加載
11.應用開發中自定義View的時候,交互部分,千萬不要寫成線程不斷刷新界面顯示,而是根據TouchListener事件主動觸發界面的更新如果你的應用總是在后台不斷的輸出Log.i或Log.d的內容,除了增加系統開銷外,對你應用的整體效率受影響,尤其是持續輸出很多內容。由於Log需要底層的JNI調用,對Java虛擬機的開銷來說還是不小的。
二、ProGuard擾碼器
對於Android應用加密,擾碼器可能除了修改類和變量的名稱外,增加算法復雜難度,可能出現本身1+1=2的問題變為了2*10-10-8這樣的情況,當然Android是舉個例子來說明擾碼器的工作原理,這對於程序的運行效率和部分邏輯可能會改變,所以這點要權衡配置擾碼器是否僅修改變量名稱。
三、基礎知識
1. 訪問變量比訪問一個類的字段要快/
2. 同時判斷數組為空一般不用getCount()==0這樣的方法,直接通過isEmpty()這樣的方法來處理
3. 很多情況下慎用全局的靜態類。
4. Android應用執行起來很多的CPU占用都是出在JVM資源是放上,所以如果盡可能的減少內存的釋放,或增加手機的RAM對程序的執行效率會很有幫助。
5. 盡量少的注冊系統廣播通知接收,同時適當的可以通過重寫onPause或onResume來控制Activity顯示時才獲取部分系統廣播。
1. 采用硬件加速,在androidmanifest.xml中application添加 android:hardwareAccelerated="true"。不過這個需要在android 3.0才可以使用。
2. View中設置緩存屬性.setDrawingCache為true.
3. 優化你的布局。通過Android sdk中tools目錄下的layoutopt 命令查看你的布局是否需要優化。
4. 動態加載View. 采用ViewStub 避免一些不經常的視圖長期握住引用.
5. 將Acitivity 中的Window 的背景圖設置為空。getWindow().setBackgroundDrawable(null);android的默認背景是不是為空。
6. 采用<merge> 優化布局層數。 采用<include >來共享布局。
7. 查看Heap 的大小
8. 利用TraceView查看跟蹤函數調用。有的放矢的優化。
9. cursor 的使用。不過要注意管理好cursor,不要每次打開關閉cursor.因為打開關閉Cursor非常耗時。 Cursor.require用於刷新cursor.
10. 采用環形Buffer(可以采用鏈表數據結構實現)。可以設置一個鏈表長度的上限,根據手勢的變化來不斷地更新環形Buffer的內容。
11. 采用SurfaceView在子線程刷新UI, 避免手勢的處理和繪制在同一UI線程(普通View都這樣做)。
12. 采用JNI,將耗時間的處理放到c/c++層來處理。
13. 有些能用文件操作的,盡量采用文件操作,文件操作的速度比數據庫的操作要快10倍左右。
14. 懶加載和緩存機制。訪問網絡的耗時操作啟動一個新線程來做,而不要再UI線程來做。