一,
Force Close,意为强行关闭,当前应用程序发生了冲突。简称FC。
NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常。
偶尔一次的FC 可以不用台在意。 但是常常发生FC就一定要引起重视, FC是一种非常严重的问题。
二, 规避:
1, 可以实现Thread.UncaughtExceptionHandler接口的uncaughtException方法。再补充一句,想要哪个线程可以处理未捕获异常,Thread.setDefaultUncaughtExceptionHandler( this); 这句代码都要在那个线程中执行一次
在uncaughtException方法中,第一个参数是线程,第二个参数是异常。
成功捕获到了异常,而且activity也退出了,可是并不是安全退出,因为当你再次点击打开apk时,发现程序无响应。
为了解决上述问题,我在uncaughtException方法里将进程杀死,杀死进程有好多中方法,在此列举一个自杀式方法
android.os.Process.killProcess(android.os.Process.myPid());
参考:http://www.jb51.net/article/90176.htm
2, Forceclose这类问题主要通过Thread.UncaughtExceptionHandler这个类来捕获异常。通过实现类里面的方法uncaughtException来实现应用在捕获到异常后进行相关的处理。一般这里处理基本放在应用的Application类中。
同样的对于ANR问题,应用也可以做相关处理。对ANR,我们可以这样处理。通过一个看门狗来实时的检测主线程,一旦主线程发生阻塞,则通知Application 做相关处理。
主要方法是在线程中每隔一段时间(Activity一般是5S,广播一般是10S),向主线程发送一个messager,使计数器加1,如果到点没有加1,则表明主线程阻塞。
3, 在代码开发的过程中要思维缜密,做到逻辑严密,善于try catch, 注意代码规范。同时测试也尽量多的去覆盖。 就能很大程度上避免上市后的FC 。
参考:https://www.2cto.com/kf/201504/393309.html
三,和ANR的区别
参考:
ANR,程序没有响应,有可能程序会再次响应
例子:
应用运行时,Main线程进行了耗时操作
应用运行时,用户操作过于频繁
Force close:程序抛出异常,会强制退出
例子:
应用运行时抛出了OutOfMemoryError,
应用运行时抛出了RuntimeException
出现场景
ANR出现场景:
主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
主线程中存在耗时的计算
主线程中错误的操作,比如Thread.wait或者Thread.sleep等
Android系统会监控程序的响应状况,一旦出现下面情况,则弹出ANR对话框
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。
默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。超出就会提示应用程序无响应(ANR:Application Not Responding)对话框。
三种常见类型
1: KeyDispatchTimeout(5 seconds) -- 主要类型
按键或触摸事件在特定时间内无响应
2 : BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成
3: ServiceTimeout(20 seconds) -- 小概率类型
Service在特定的时间内无法处理完成
Force close出现场景(一般是异常情况):
比如空指针、数组越界、类型转换异常等等。
捕获:可以通过logcat查看抛出异常的代码出现的位置,然后到程序对应代码中进行修改。
四,下列哪些情况下系统会程序抛出异常,强制退出(不定项选择)
应用运行时,Main线程进行了耗时操作
应用运行时抛出了OutOfMemoryError
应用运行时抛出了RuntimeException
应用运行时,用户操作过于频繁