gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:22:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com