在软件开发中怎么样去避免ANR?

电子说

1.3w人已加入

描述

一:什么是ANR

如果应用程序不能响应用户的输入了,那么就可以说应用ANR了。

如果需要运行一个耗时较长的操作的时候,不要把这个任务放在UI线程上运行,而是单独创建一个线程运行那些操作。

以下情况会出现ANR提示对话框:

5秒内对一个输入动作没有反应。

一个BroadcastReceiver在10秒内没有完成运行。

二:如何避免ANR

在activity的关键的生命周期方法: onCreate 和 onResume方法上尽可能处理越少越好的事情。

下面列举的操作都是长时间运行的:网络工作、数据库操作、精确的计算,例如重新定制图片(应该在单独的工作线程中)、或者通过异步请求操作数据库的情况下。

最有效的创建一个工作线程来执行长时间操作的是Asynctask类。如果你非要自己创建一个自己的Thread或者HandlerThread类,你应该设置这个类的属性为"background",通过调用Process.setThreadPriority() ,填上THREAD_PRIORITY_BACKGROUND参数。如果你不设置低优先级,那么你的线程仍然有可能减慢你的应用,因为它默认运行的优先级和你的UI线程的优先级一样。当你实现Thread或HandlerThread方法的时候,确定你的UI线程不会在等待工作线程结束的过程中被阻塞,不要调用Thread.wait()或者 Thread.sleep()。你的应用主线程不应该因为等待子线程完成而阻塞,而是应该提供一个Handler去接受其他线程完成后的结果。这样设计你的应用可以保证你的应用仍然能够响应用户的输入,避免ANR。

接受BroadcastReciver的执行时间,约束它的执行时间,主要进行的操作是保存设置或者注册一个通知,这样的话,才能够避免当其他方法调用UI线程的时候,应用程序在执行长耗时的方法。

如果非要在接收Broadcast后执行长时间的操作,可以启动一个IntentService来执行。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • anr

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分