恼人的ANR

早先年用Android的时候,就连很多知名的app也总是莫名其妙崩溃,好像手机快的时候会崩溃,手机卡的时候app会卡死。卡死的时候会弹出来一个框,询问是要结束app还是继续等待。这就是ANR(Application Not Responding)无疑了。

ANR一般有三种类型:

  1. KeyDispatchTimeout(5 seconds) — 按键或触摸事件在5秒内无响应

  2. BroadcastTimeout(10 seconds) — BroadcastReceiver在10秒内无法处理完成

  3. ServiceTimeout(20 seconds) — Service在20秒内无法处理完成

第一种类型很常见,就是你在UI线程里做了很多耗时的工作,导致UI阻塞住超过5秒,这个时候用户一定很气恼准备砸手机卖肾了,Android系统也会认为你的app做得实在是太烂了,赶紧提示用户把app结束掉,别让用户以为是安卓太烂了的缘故。

第二种也是一样,你刚刚接收到一个低电量的广播,要么赶紧弹一个框出来让用户注意电量(前台),要么赶紧开一个Service默默地杀掉耗电的app(后台),但是你若是在BroadcastReceiver里磨磨蹭蹭犹豫不决,Android系统也会认为你这个app简直是天秤座附体,赶紧回家纠结吧,别占着广播台了。

第三种比较少见,但也会出现,比如处理一些数据的时候算法不够优化,写大量文件啊,等等。

处理办法

  • 1和3的处理办法就是:开线程、开线程、开线程,然后用上一课我们学到的Handler去异步处理UI。
  • 2的话和上文提到的一样,要么转换成1的问题或者3的问题,不要停留在Broadcast里。

防患于未然

耗时的操作主要是I/O操作:

  • 网络请求

    当你准备进行网络操作的时候,想都不要想,一定要开线程。在Android2.x的时候还允许你在主线程里进行网络请求(只要不超过ANR的5秒限制),现在的Android4.x就不要想了,连ANR的机会都不会给你,直接报异常退出。

  • 文件读写

    当你用java的File操作的时候当然会警觉,会想到要开线程。但是有些坑你未必就能注意到:

  1. 数据库操作,尤其是可能会有大量批量的数据库操作的时候。

    (我表示曾经被坑过,即便你是开了线程,在大量数据库操作时的超级慢也会让人受不了,你需要搜索一下“SQLite的事务处理”,症结在这儿。

    ps:不只是SQLite,数据库在批量操作的时候都需要“事务处理” 。)

  2. 注意SharedPreferences,由于SharedPreferences封装的很好,所以很多时候往往会忘记这东西本质上是在读写xml文件啊!

    虽然一般用这种方式存储是很少的数据量,但依然不可小觑。还有个小细节也要改变一下以往的习惯:

    SharedPreferences sp=context.getSharedPreferences("xxx",context.MODE_PRIVATE);
    SharedPreferences.Editor editor=sp.edit();
    editor.putInt("num",1);
    // editor.commit(); 没错,旧方法是使用commit(),它是直接操作文件的
    editor.apply(); //推荐使用新方法apply(),它是异步的
  • 计算密集型操作

    没啥说的,异步,然后优化算法吧。如果计算结果不是急需要的话可以托管给服务端来处理嘛!

一些参考数据增加你的经验

  • 100到200ms是用户能感知阻滞的时间阈值
  • /data/anr/traces.txt里记录了你的应用程式发生过的ANR的一些信息

    有兴趣可以动手试试,traces.txt能提供很多很多有用的数据

    $chmod 777 /data/anr
    $rm /data/anr/traces.txt
    $ps
    $kill -3PID
    adbpull data/anr/traces.txt ./mytraces.txt

    用这些命令可以有助于你清晰地查看traces.txt

参考资料:http://mzh3344258.blog.51cto.com/1823534/804237

总结

总而言之,ANR的存在就是在不断提醒你,优化,优化,再优化。优化效率,优化视觉,优化体验。

原文来自个人博客:【第三课】anr和oom-贪快和贪多的后果(上)

by:cyhhao http://cyhhao.zhusun.in

【第三课】ANR和OOM——贪快和贪多的后果(上)的更多相关文章

  1. 【第三课】ANR和OOM——贪快和贪多的后果(下)

    Out of Mana,法力耗尽. 内存就像法力,耗尽了就什么都不能做了.有时候一个应用程序占用了太大的内存,超过了Android系统为你规定的限制,那么系统就会干掉你,以保证其他app有足够的内存. ...

  2. BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板

    BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...

  3. Git速成学习第三课:创建与合并分支

    本来第三课想记录一下远程仓库的创建与克隆0.0但是想了想还是不写了. 这里写一下分支管理中的创建与合并. Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng. ...

  4. CodeIgniter框架入门教程——第三课 URL及ajax

    本文转载自:http://www.softeng.cn/?p=74 这节课讲一下CI框架的路由规则,以及如何在CI框架下实现ajax功能. 首先,先介绍CI框架的路由规则,因为CI框架是在PHP的基础 ...

  5. SQL初级第三课(下)

    我们续用第三课(上)的表 辅助表 Student                   Course               Score                    Teacher Sno ...

  6. shellKali Linux Web 渗透测试— 初级教程(第三课)

    shellKali Linux Web 渗透测试— 初级教程(第三课) 文/玄魂 目录 shellKali Linux Web 渗透测试—初级教程(第三课) 课程目录 通过google hack寻找测 ...

  7. NeHe OpenGL教程 第三课:颜色渲染

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. 【Linux探索之旅】第二部分第三课:文件和目录,组织不会亏待你

    内容简介 1.第二部分第三课:文件和目录,组织不会亏待你 2.第二部分第四课预告:文件操纵,鼓掌之中 文件和目录,组织不会亏待你 上一次课我们讲了命令行,这将成为伴随我们接下来整个Linux课程的一个 ...

  9. 【Web探索之旅】第三部分第三课:协议

    内容简介 1.第三部分第三课:协议 2.第四部分预告:Web程序员 第三部分第三课:协议 之前的课,我们学习了Client-Server模型的客户端语言和服务器语言. 客户端语言有HTML,CSS和J ...

随机推荐

  1. [Aaronyang] 写给自己的WPF4.5 笔记22 [3d交互与动画 3/4]

    OK,前面我们的3d模型都比较囧啊,最近也看了一点ZAM了解了一下,大致至少可以做个简单的模型用来演示. 1.交互,动起来的思路 ①修改Model3D对象的变换 ②修改应用于ModelVisual3D ...

  2. 超体.特效中英字幕.Lucy.2014.BD1080P.X264.AAC.English&Mandarin.CHS-ENG

    资源名称 其它信息 资源大小 BT下载 超体.Lucy.2014.BD-MP4-原创翻译中英双语字幕.mp4 seeders: / leechers: 511.15MB 下载 [飘域家园]移动迷宫.T ...

  3. Halcon学习标定助手

    本文采用halcon标定助手进行标定. 第一步:打开标定助手. 第二步:对描述文件进行修改 具体:打开算子窗口,输入gen_caltab,进行描述文件修改. 参数XNum和YNum为7行*7列的圆,M ...

  4. oracle密码错误验证延迟

    补充从10g升级到11g之后需要注意的几个密码方面问题: 1. 11g默认开始密码区分大小写,可以通过把参数设置为SEC_CASE_SENSITIVE_LOGON =FALSE 屏蔽 2. 11g密码 ...

  5. Conway's Game of Life: An Exercise in WPF, MVVM and C#

    This blog post was written for the Lockheed Martin Insight blog, sharing here for the external audie ...

  6. HL AsySocket 服务开发框架 - 总体思路与架构

    一 背景 最近在园子了浏览了几篇有关Socket文章,得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocke ...

  7. 无须任何软件配置iis+ftp服务器图文说明

    1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...

  8. Photoshop CS6 for Mac简体中文正式 完美破解版 支持Retina屏

    Photoshop CS6 MAC 中文版破解版 支持Retina屏 目前世界上“最好的化妆品”是一款叫做PhotoShop的产品,它可以帮你去除所有你不满意的地方.上周末,这款最好的化妆品推出了第十 ...

  9. C#代理那点事儿

    Func代理是啥? Func代理接收0个或多个参数,返回TResult值: 以Func<TSource, TResult>为例:Func带来封装一个方法,该方法接收一个参数,然会一个TRe ...

  10. file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did

    file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did 解决办法 ,如果你是用的服务器,可以参考这个办法,修改 ...