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

Gaj*_*lur 1 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();
}
Run Code Online (Sandbox Code Playgroud)

我尝试生成 ANR 以用于测试目的,如下所示:

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

但屏幕上仍然出现了 ANR。如何使用StrictMode避免ANR?是否可以?

Pri*_*tel 5

什么是ANR?

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

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

如何避免ANR?

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

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

诊断 ANR:

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

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

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