2

我在某处读到,通过使用 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?可能吗?

4

3 回答 3

4

什么是 ANR?

当 Android 应用的 UI 线程被阻塞太久时,会触发“Application Not Responding”(ANR)错误。如果应用程序位于前台,Android 将在检测到以下情况之一时显示特定应用程序的 ANR 对话框:

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

如何避免 ANR?

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

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

诊断 ANR:

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

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

查看官方 android 开发者文档了解,如何解决 ANR 问题?

于 2018-04-18T09:46:37.540 回答
1

您可以通过以下代码段禁用严格模式

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

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

于 2018-04-18T09:50:10.043 回答
0

正如StrictMode 文档所说:

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

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

于 2018-04-18T09:47:22.767 回答