Android性能優化總結

  1. 採用硬件加速,在androidmanifest.xml中application添加android:hardwareAccelerated=“true”。不過這個需要在android 3.0纔可以使用。android4.0這個選項是默認開啓的。

  2. View中設置緩存屬性.setDrawingCache爲true.

  3. 優化你的佈局。通過Android sdk中tools目錄下的layoutopt 命令查看你的佈局是否需要優化。

  4. 動態加載View. 採用ViewStub 避免一些不經常的視圖長期握住引用.

  5. 將Acitivity 中的Window 的背景圖設置爲空。getWindow().setBackgroundDrawable(null);android的默認背景是不是爲空。

  6. 採用 優化佈局層數。 採用來共享佈局。

  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線程來做。

  15. 避免創建不必要的對象

  16. 如果方法用不到成員變量,可以把方法申明爲static,性能會提高到15%到20%

  17. 避免使用getter/setter存取field,可以把field申明爲public,直接訪問

  18. static的變量如果不需要修改,應該使用static final修飾符定義爲常量

  19. 使用增強for循環
    如:Set set = new HashSet();
    // for循環遍歷:
    for (Object obj: set) {
    if(obj instanceof Integer){
    int aa= (Integer)obj;
    }else if(obj instanceof String){
    String aa = (String)obj

           } ........
     }
    
缺點:在遍歷 集合過程中,不能對集合本身進行操作

        for (String str : set) {
                set.remove(str);//錯誤!
        }
  1. 私有內部類要訪問外部類的field或方法時,其成員變量不要用private,因爲在編譯時會生成setter/getter,影響性能。可以把外部類的field或方法聲明爲包訪問權限

  2. 合理利用浮點數,浮點數比整型慢兩倍;

22.針對ListView的性能優化

item儘可能的減少使用的控件和佈局的層次;背景色與cacheColorHint設置相同顏色;ListView中item的佈局至關重要,必須儘可能的減少使用的控件,佈局。RelativeLayout是絕對的利器,通過它可以減少佈局的層次。同時要儘可能的複用控件,這樣可以減少ListView的內存使用,減少滑動時GC次數。ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動時的渲染性能。ListView中getView是性能是關鍵,這裏要儘可能的優化。getView方法中要重用view;getView方法中不能做複雜的邏輯計算,特別是數據庫操作,否則會嚴重影響滑動時的性能。

二.JAVA相關

1 不用new關鍵詞創建類的實例,用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable接口,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。

在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:
public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
2 使用非阻塞I/O
版本較低的JDK不支持非阻塞I/O API。爲避免I/O阻塞,一些應用採用了創建大量線程的辦法(在較好的情況下,會使用一個緩衝池)。這種技術可以在許多必須支持併發I/O流的應用中見到,如Web服務器、報價和拍賣應用等。然而,創建Java線程需要相當可觀的開銷。
JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這裏有一個支持非阻塞I/O的軟件包。
3 慎用異常
異常對性能不利。拋出異常首先要創建一個新的對象。Throwable接口的構造函數調用名爲fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因爲在處理過程中創建了一個新的對象。
異常只能用於錯誤處理,不應該用來控制程序流程。
4 不要重複初始化變量
默認情況下,調用類的構造函數時, Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和 double變可柚貿?.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因爲用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。
5 儘量指定類的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。爲String類指定final防止了人們覆蓋length()方法。
另外,如果指定一個類爲final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。
6 儘量使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量、實例變量等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變量還可能得到進一步優化。請參見《儘可能使用堆棧變量》。
7 乘法和除法
考慮下面的代碼:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以極大地提高性能。下面是修改後的代碼:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

8.不要隨意的使用stingA=StringB+StringC的寫法,有大量拼接操作的地方用StringBuilder代替。

最後:性能差異帶來的影響
Android手機定製化程度太高,價格從600塊至5000塊不等,因此,性能肯定存在差異,無論從GPS還是內存角度來講都是如此。
分辨率不同的適配
進行數據量比較大的交互設計會出現不同的問題,因此,要做網絡差異優化的話,就要保證能夠在價格比較低的Android手機上正常使用。
針對性放棄動畫交互
在iOS平臺上做交互設計很容易,但在Android平臺上則會考慮到崩潰的問題,因此在Android上,我們便針對性地放棄了一些動畫的交互。
數據交互的不同處理
每一條數據有大有小,如果運行時間長的話,數據就比較大一點。在Android上進行交互時,反應可能會比較慢,並且隨時有可能崩潰,因此我們會進行分段數據的處理,點擊每一段數據時再讀取詳細的數據。
網絡差異的優化
網絡差異化主要針對離線和2G/3G網絡,網絡的差異會影響用戶體驗,用戶在使用2G網絡時,減少一些交互次數,在速度上處理得更加緩和,在運行速率和效率上有所保證,一切以用戶體驗爲核心。

面臨的問題
Android版本:
GPS硬件差異,Android手機型號衆多,導致GPS硬件參差不齊,定位速度、準確性有較大偏差;
機能差異導致操作流暢度問題,內存不足導致崩潰;
Android系統多元化,軟件運行兼容性不強;
分辨率的不統一,造成工作量的增加;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章