Android性能優化


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事件主動觸發界面的更新
 
 
 
----------------------------------------------------------------------------------------------------------------------------
 
 一、慎用Logcat輸出
  如果你的應用總是在后台不斷的輸出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線程來做。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM