2015-04-01 63 views
0

我知道StrictMode主要用於應用程序開發階段,但根​​據我的應用程序需求,獲取ANR是不可接受的,但碰到崩潰是可以接受的,並且StrictMode提供了一種方法阻止ANR對話框:在應用程序生產階段使用StrictMode

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() 
      .penaltyLog().penaltyDeath().build()); 

如果我在應用程序生產階段使用它,該怎麼辦?當應用程序獲得ANR而使用StrictMode時會發生什麼?它會凍結,崩潰還是等到重新獲得響應?

+3

什麼操作可能導致ANR? – 2015-04-01 14:09:12

+0

@ A.S。這不是特定的操作,它每隔很長一段時間就會發生,但根據我的應用程序環境,收到Not Responding消息是不可接受的。 它發生在最後一次添加在水平線性佈局的彈出窗口內創建大量數據時。 – 2015-04-01 14:12:42

+2

*水平線性佈局中彈出窗口內的大量數據*多麼可怕的想法......爲什麼不使用listview/recyclerview? – Selvin 2015-04-01 14:13:40

回答

2

默認情況下禁用StrictMode,用戶需要在其Android中輸入「開發者模式」才能啓用它。
這使得使用StrictMode的解決方案無關緊要。

由於非常低的內存或其他窒息CPU的情況,ANR可能會發生在非常罕見的情況下完全不受控制。
但是,只需將訪問存儲或網絡的每個操作都轉移到異步任務,您就可以最大限度地降低獲取ANR的可能性。
在我的軟件,我這行代碼添加到所有危險的地方:

assert !Util.isMainThread():"woh! what am I doing on the main thread??"

,並有一些的Util類此方法:

public static boolean isMainThread() { 
    return Looper.myLooper().equals(Looper.getMainLooper()); 
} 

......而一個有用的技巧,快速啓用命令行斷言:
adb shell setprop debug.assert 10禁用。

+0

好,非常感謝 – 2015-04-05 09:15:40

相關問題