是否可以在android中使用StrictMode来避免ANR?

时间:2018-04-18 09:24:28

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

我读到的一些内容通过使用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?有可能吗?

3 个答案:

答案 0 :(得分:3)

什么是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?

答案 1 :(得分:0)

正如StrictMode documentation所说:

  

StrictMode是一个开发人员工具,可以检测您可能正在执行的操作   意外地将它们引起你​​的注意,以便你可以修复它们。

StrictMode将帮助您通过限制访问来告知代码的哪一部分执行过多的工作,如网络或磁盘,然后为您提供ANR或崩溃日志,这取决于您设置的惩罚。它不会删除任何ANR,但会限制您创建导致ANR的代码。

答案 2 :(得分:0)

您可以通过以下代码段

禁用严格模式
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = 
    new StrictMode.ThreadPolicy.Builder().permitAll().build();      
        StrictMode.setThreadPolicy(policy);
}

你正在做的是启用严格模式,你需要禁用它,因为我理解你的问题。