google在android2.3中新增了StrictMode API來設置對一個thread的策略(ui線程或者分線程),它主要檢測了讀寫操作,訪問網絡,數據庫讀寫等耗時的操作並將其以log或者dialog等形式打印出來。分析這些日誌,我們可以儘快找出程序運行緩慢的原因進而優化代碼,避免ANR(Application Not Responding)窗口的出現。
啓用StrictMode
推薦的使用StrictMode的方式是,在開發階段,打開它,在發佈應用前,關閉它。
例如:在你的應用中,onCreate():
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //構造StrictMode
.detectDiskReads() //當發生磁盤讀操作時輸出
.detectDiskWrites()//當發生磁盤寫操作時輸出
.detectNetwork() //訪問網絡時輸出,這裏可以替換爲detectAll() 就包括了磁盤讀寫和網絡I/O
.penaltyLog() //以日誌的方式輸出
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探測SQLite數據庫操作
.penaltyLog() //以日誌的方式輸出
.penaltyDeath()
.build());
}
super.onCreate();
}
當觸發策略中的操作時系統會打印出一條StrictMode日誌,格式如下:
02-27 10:03:56.122: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=696 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
02 02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)
另外說明兩點:
1.在android2.3版本直接在ui線程中訪問網絡會報錯
2.ANR窗口會在程序阻塞或者耗時超過5秒的運算後彈出
轉載自:http://fariytale.iteye.com/blog/1293530