0

我知道StrictMode主要设计用于应用程序开发阶段,但根​​据我的应用程序需要,获得 ANR 是不可接受的,而崩溃是完全可以接受的,并StrictMode提供了一种防止 ANR 对话框的方法:

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

如果我在应用程序生产阶段使用它会怎样?当应用程序在使用时出现ANR时会发生什么StrictMode?它会冻结、崩溃还是等到再次响应?

4

1 回答 1

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禁用。

于 2015-04-04T09:35:52.580 回答