我知道StrictMode主要用于应用程序开发阶段,但是根据我的应用程序需求,获取ANR是不可接受的,但是崩溃是可以接受的,并且StrictMode
提供了一种防止ANR对话框的方法:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
.penaltyLog().penaltyDeath().build());
如果我在app制作阶段使用它会怎么样?当应用程序在使用StrictMode
时获得 ANR 会发生什么?会冻结,崩溃还是等到再次回复?
答案 0 :(得分:2)
默认情况下禁用StrictMode,用户需要输入"开发人员模式"在他们的Android中启用它。
这使得使用StrictMode的解决方案无关紧要
由于内存非常低或其他app阻塞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 1
或0
。