转载请注明出处:王亟亟的大牛之路
崩溃和未响应是我们开发过程中经常会碰到,而且是很不希望碰到的问题,像这样:
(崩溃)
或者是这样?
通常,我们主线程被阻塞的时候会出现未响应的情况,而某些异常出现却为被处理会出现系统的崩溃。
这里我们来说下ANR:
全名:Application Not Responding
一般何时会出现?
—主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
—BroadcastReceiver 没有在10秒内完成返回
—主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
—主线程中存在耗时的计算
—主线程中错误的操作,比如Thread.wait或者Thread.sleep等
系统通常会如何告知用户?
系统就会弹出一个ANR对话框,用户可以自行选择继续等待亦或者是停止当前程序。
如何避免?
—使用AsyncTask处理耗时IO操作。
使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
—使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
—Activity的onCreate和onResume回调中尽量避免耗时的代码
—BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。
通常100到200毫秒就会让人察觉程序反应慢,为了更加提升响应,可以使用下面的几种方法
—如果程序正在后台处理用户的输入,建议使用让用户得知进度,比如使用ProgressBar控件。
—程序启动时可以选择加上欢迎界面,避免让用户察觉卡顿。
—使用Systrace和TraceView找出影响响应的问题。