zoukankan      html  css  js  c++  java
  • 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就是其中一种解决方案

  • 相关阅读:
    产品经理的创新思维
    大型互联网网站架构心得之二:并、换和其它(转)
    访问IIS元数据库失败解决方法(转)
    (转)SQL Server 假执行,预执行
    从LiveJournal后台发展看 大型网站系统架构以及性能优化方法(转)
    浏览器并发连接数
    转:Session服务器配置指南与使用经验
    转:安装IIS无法找到zClientm.exe文件的解决办法
    使用开源软件,设计高性能可扩展互动网站
    大型互联网网站架构心得之一:分(转)
  • 原文地址:https://www.cnblogs.com/Qunter/p/7118538.html
Copyright © 2011-2022 走看看