我在某处读到通过使用 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/