导致android app Force Close原因,如何规避

版权声明:本文为博主原创文章,转载请带出处。 https://blog.csdn.net/hejianhua1/article/details/79813182

一,

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的区别

参考:https://blog.csdn.net/lin111000713/article/details/52459888

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
  • 应用运行时,用户操作过于频繁

猜你喜欢

转载自blog.csdn.net/hejianhua1/article/details/79813182