ANR与Crash

实际开发过程中,ANR和Crash经常会出现,如果要想办法避免他们的出现,首先就要了解他们

ANR

ANR即(application not responding),即应用无响应,程序会弹出一个dialog提示用户程序无响应,而这对于用户体验无疑是很不好的

至于程序为何会“无响应”,主要有以下几个原因

1:InputDispatching (5 seconds) --主要类型

按键或触摸等输入事件在特定时间内无响应

2:BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) --小概率类型

Service在特定的时间内无法处理完成

看起来好像略复杂,其实可以换个角度来理解,一般对于正常的APP而言,能造成长时间操作的主要就是耗时操作,大体上分为两类,其一是网络操作,其二是文件,数据库的读写操作

如果耗时操作在UI线程,也就是主线程内进行操作,而且也确实“耗时”的情况下,就会造成UI线程的堵塞,也就造成了ANR

所以简而言之,能够解决ANR的办法就是不在主线程内进行耗时操作

这里就提出了一个概念,异步

异步说的简单些,就是多开线程,在其他线程内处理这些耗时操作,处理完毕之后,返回所需要的参数给主线程,主线程再做操作(所以之所以主线程又叫做UI线程,是因为我们应该只在主线程内处理UI操作)

异步的实现就说来话长了,从最开始的Thread+Handler,到后面的AsyncTask,再到Rxjaca,这里就不多做说明了

通过异步,我们可以让UI线程不堵塞或者尽量低可能性的堵塞,这样就极大避免了ANR的出现

Crash

crash,即崩溃,和ANR一样,系统会弹出一个dialog提示用户该应用已崩溃,同理,用户体验很糟糕

之所以会出crash,一句话概括,基本就是因为异常的出现

在程序中可能会出现你未捕获到的异常,这就造成了崩溃,但是这种情况下即使出现了crash我们也应该换一种对用户较为友好的方式来告知用户

那么如何改掉crash的提示方式呢,比较原始的方法,附上任玉刚大神的一篇博文

Android程序Crash时的异常上报

当然了,这么久过去了,现在处理的方式也可以接入第三方的SDK来解决,远的不说,腾讯的Bugly就是其中一种解决方案

原文地址:https://www.cnblogs.com/Qunter/p/7118538.html