Android ANR原因及解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android ANR原因及解决办法相关的知识,希望对你有一定的参考价值。

1、什么是ANR

android中,应用程序的响应性是由ActivityManager和WindowManager系统服务监视的。当监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR

A activity中5秒内没有响应输入事件(如按键按下、屏幕触摸)

B BroadcastReceiver在10秒内没有执行完毕

造成以上情况出现的原因有很多,主要的原因是在主线程中做了非常耗时的操作,如下载、IO异常等。

2、如何避免ANR 

一般耗时的操作,如网络及数据库的访问、高耗时计算(改变位图尺寸),应放在子线程中(或诸如数据库操作应通过异步请求的方式)来完成。不是让主线程阻塞在那里等待子线程完成,也不是调用Thread.wait()或Thread.sleep(),而是主线程应为子线程提供一个Handler,一旦完成后能提交给主线程。

主要做法:

A 运行在主线程的任何方法都应尽可能少做耗时的事,在Activity的onCreate()和onResume()等关键生命周期方法中要特别注意。可采用重开子线程的方式,然后使用Handler+Message的方式来处理耗时的操作,如更新主线程中的UI等。

B 应用程序应避免在BroadcastReceiver中做耗时的操作或计算。与activity中不同,BroadcastReceiver生命周期短,因此也不在子线程中做这些任务。如果相应Intent广播需要执行一个耗时的操作的话,取而代之的是,应让应用程序启动一个service来处理。

也要避免在BroadcastReceiver里启动一个Activity,因为这样会创建一个新的界面,会对抢夺用户的操作焦点,影响用户体验。如果应用程序在相应Intent广播时需向用户展示,那么就应该用Notification Message来实现。

总结:ANR异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。

http://blog.sina.com.cn/s/blog_618199e60101kvbl.html

以上是关于Android ANR原因及解决办法的主要内容,如果未能解决你的问题,请参考以下文章

Android ANR:原理分析及解决办法

android ANR产生原因和解决办法

android ANR产生原因和解决办法

android ANR产生原因和解决办法

jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法

Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法