我读到的一些内容通过使用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?有可能吗?
答案 0 :(得分:3)
什么是ANR?
当Android应用的UI线程被阻止太长时间时,"应用无响应" (ANR)错误被触发。如果应用程序位于前台,Android将在检测到以下某个条件时显示特定应用程序的ANR对话框:
如何避免ANR?
通过保持应用程序的主线程响应,可以防止ANR对话框显示给用户。
onCreate()
和onResume()
。诊断ANR:
StrictMode是一个开发人员工具,可以检测应用程序主线程上的意外磁盘或网络访问,其中接收UI操作并进行动画制作。您可以在应用程序或活动级别使用StrictMode。
结帐官方android开发人员文档,How to fix the ANR problems?
答案 1 :(得分:0)
StrictMode是一个开发人员工具,可以检测您可能正在执行的操作 意外地将它们引起你的注意,以便你可以修复它们。
StrictMode将帮助您通过限制访问来告知代码的哪一部分执行过多的工作,如网络或磁盘,然后为您提供ANR或崩溃日志,这取决于您设置的惩罚。它不会删除任何ANR,但会限制您创建导致ANR的代码。
答案 2 :(得分:0)
您可以通过以下代码段
禁用严格模式if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
你正在做的是启用严格模式,你需要禁用它,因为我理解你的问题。