UI線程若是被阻塞5秒的話,那麼應用程序此時就會彈出ANR的對話框,ANR對應用程序來講是一個很嚴重的問題。 如何防止應用程序出現ANR,怎麼分析查看致使ANR問題的緣由? 咱們來介紹Android的嚴格模式。java
怎樣開啓嚴格模式android
有兩種開啓方式。shell
進入開發者選項,裏面找到啓用嚴格模式,打開。 當應用主線程執行長時間操做的話會閃鎖屏幕。網絡
能夠在Activity或者自定義的Application類的onCreate方法裏面開啓StrictMode。ui
// 設置線程策略 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() // 磁盤讀 .detectDiskWrites() // 磁盤寫 .detectNetwork() // 網絡 .penaltyLog() .build()); // 設置VM策略 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectActivityLeaks() .detectLeakedSqlLiteObjects() // SQLite 對象 .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() // 觸發違規操做,kill應用 .build());
怎樣使用StrictMode API線程
StrictMode能夠理解爲設置策略、偵測違規操做、懲罰。code
設置策略有兩種對象
偵測違規操做包含以下,可分爲線程策略可偵測的違規操做和 VM策略可偵測的違規操做進程
線程策略可偵測的違規操做內存
VM策略可偵測的違規操做
懲罰方式
怎樣分析StrictMode Log
能夠經過 adb shell 來過濾StrictMode log。
adb logcat -s StrictMode
過濾StrictMode log以下:
02-12 21:43:41.580: E/StrictMode(14269): class com.test.TestActivity; instances=2; limit=1 02-12 21:43:41.580: E/StrictMode(14269): android.os.StrictMode$InstanceCountViolation: class com.example.testa.BActivity; instances=2; limit=1 02-12 21:43:41.580: E/StrictMode(14269): at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)
instances=2 limit=1,說名限制的TestActivity實例只能是一個,卻有兩個實例,說明TestActivity有內存泄漏。
其餘StrictMode Log 能夠根據上下文的描述分析是什麼違規致使。