【问题标题】:Using StrictMode in app production phase在应用生产阶段使用 StrictMode
【发布时间】:2015-04-01 14:07:09
【问题描述】:

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

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

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

【问题讨论】:

  • 哪些操作会导致 ANR?
  • @A.S.这不是特定的操作,它每隔很长时间就会发生一次,但是根据我的应用程序环境,根本不能接受收到 Not Responding 消息。上次在水平线性布局的弹出窗口中添加创建大量数据时发生。
  • 水平线性布局中弹出窗口内的大量数据真是个糟糕的主意……你为什么不使用 listview/recyclerview?
  • @Selvin 实际上,关于设计,它会是一个非常复杂的 ListView,虽然我认为使用 LinearLayouts 会更容易。
  • @MuhammedRefaat 你可以在PopUpWindow 内部使用水平方向的RecyclerView 而不是LinearLayout

标签: android android-anr-dialog android-strictmode


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-01-05
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2011-03-28
    • 1970-01-01
    • 2022-11-14
    • 2017-07-04
    相关资源
    最近更新 更多