【问题标题】:Is it possible to avoid ANR using StrictMode in android?是否可以在 android 中使用 StrictMode 来避免 ANR?
【发布时间】:2018-09-28 11:23:34
【问题描述】:

我在某处读到,通过使用 StrictMode,我们可以避免 Android 中的 ANR。我试过了,下面是代码

public class MyApplication extends Application {

@Override
public void onCreate() {


        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .penaltyFlashScreen()
                .penaltyDeath()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .build());

    super.onCreate();
}

我尝试生成 ANR 用于如下测试目的:

 @Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("kishan","onTouchEvent");
    while(true) {}
}

但是,ANR 仍然出现在屏幕上。如何使用 StrictMode 避免 ANR?有可能吗?

【问题讨论】:

  • StrictMode 可以为您提供一些信息(“StrictMode 是一个开发人员工具,它可以检测您可能不小心做的事情并引起您的注意,以便您修复它们。”)。但是如果你在 UI 线程上做了太多的工作(ANR 的常见原因),那么你需要使用后台线程/AsyncTasks 来承受压力。见here
  • @JonGoodwin 哦,你的意思是它不会关闭 ANR
  • 没有这种运气,它只会在发现您可能想看的东西时发出警告,必须解决问题!
  • @JonGoodwin 好的..谢谢

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


【解决方案1】:

什么是 ANR?

当 Android 应用的 UI 线程阻塞时间过长时,会触发“应用程序无响应”(ANR) 错误。如果应用程序在前台,Android 将在检测到以下情况之一时显示特定应用程序的 ANR 对话框:

  • 5 秒内没有响应输入事件(例如按键或屏幕触摸事件)。
  • BroadcastReceiver 未在 10 秒内完成执行。

如何避免 ANR?

通过保持应用程序的主线程响应,您可以防止向用户显示 ANR 对话框。

  • 特别是,活动应尽可能少地设置 在关键生命周期方法中,例如onCreate()onResume()
  • 可能是长时间运行的操作,例如网络或数据库 操作,或计算量大的计算,例如 调整位图的大小应该在工作线程中完成,例如 AsyncTask

诊断 ANR:

  • 应用在主线程上执行涉及 I/O 的缓慢操作。
  • 应用正在主线程上进行长时间计算。
  • 主线程正在对另一个进程执行同步绑定器调用,而另一个进程需要很长时间才能返回。
  • 主线程被阻塞,等待另一个线程上发生的长时间操作的同步块。
  • 主线程与另一个线程处于死锁状态,无论是在您的进程中还是通过活页夹调用。

StrictMode 是一个开发者工具,它可以检测应用程序主线程上的意外磁盘或网络访问,其中接收 UI 操作并发生动画。您可以在应用程序或活动级别使用 StrictMode。

查看官方android开发者文档了解,How to fix the ANR problems?

【讨论】:

    【解决方案2】:

    您可以通过以下代码 sn -p 禁用严格模式

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();      
            StrictMode.setThreadPolicy(policy);
    }
    

    您所做的是启用严格模式,您需要禁用它,据我了解您的问题。

    【讨论】:

      【解决方案3】:

      正如StrictMode documentation 所说:

      StrictMode 是一种开发人员工具,可检测您可能正在做的事情 不小心将它们提请您注意,以便您修复它们。

      StrictMode 将帮助您判断代码的哪一部分通过限制访问权限来执行网络或磁盘等过度工作,然后根据您设置的惩罚为您提供 ANR 或崩溃日志。它不会删除您的任何 ANR,但会限制您创建导致 ANR 的代码。

      【讨论】:

        猜你喜欢
        • 2023-01-25
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        相关资源
        最近更新 更多