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

标签 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?可能吗?

最佳答案

什么是 ANR?

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

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

如何避免ANR?

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

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

诊断 ANR:

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

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

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

关于android - 是否可以在 android 中使用 StrictMode 避免 ANR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49895962/

相关文章:

java - 从 OnClickListener 访问主类中的对象 - 这是一种安全的方法吗?

Android:调用 getExternalFilesDir(null) 时出现 ANR

android - 如何在 AOSP 中更改应用程序无响应 (ANR) 超时

java - 一个适配器中有多个 View (充气器)

java - XML解析安卓

java - ContextWrapper.getFilesDir() 出现 NullPointerException 的原因

android - Android平台如何检测ANR问题?

android - ImageView setImageURI 在暂停时导致严格模式错误

java - AndroidBlockGuardPolicy.onReadFromDisk FileInputStream 违规

android - Ksoap2 无法在 android 3.0 中工作并出现 NetworkOnMainThreadException