安卓实现分业务模块异常捕获,全局异常不崩溃,应用继续运行!

需求:按当前项目工程的组织结构,业务模块被分为多个独立的Module,要求当业务模块内发生未捕获到的局部异常时,不重启整个应用,只是单独重启某个异常的业务模块

目前安卓中常用的异常捕获有两种方式:

一种是局部异常捕获,使用try catch包括目标代码块

一种是使用Thread.setDefaultUncaughtExceptionHandler捕获全局异常,但主线程发生异常使用此种方式捕获,应用必将崩溃或重启,无法做到只重启某业务模块

显然两种方式都无法满足需求,那么此时还有另外一种出现全局异常不崩溃,更优雅的异常处理方式:

接管主线程的Looper.loop()方法,并且使用try catch包括它,判断业务模块的包名,重启目标业务模块,完美满足需求

安卓实现分业务模块异常捕获,全局异常不崩溃,应用继续运行!_第1张图片

安卓应用启动时,会初始化ActivityThread对象,调用其main方法,在main方法中又调用了Looper.loop()方法,来开启消息循环,处理所有主线程操作

主线程所发生的所有异常,追踪其源头都是Looper.loop方法,接管该方法,即可将主线程出现的任何异常都正确捕获处理了,那么子线程呢


大家都知道子线程默认是没有Looper的,此时可以用捕获全局异常的方式来处理子线程的异常,全局捕获子线程异常,不会导致应用崩溃

安卓实现分业务模块异常捕获,全局异常不崩溃,应用继续运行!_第2张图片

 

两种方式相结合,可以处理应用中的所有异常,并使应用能够正常运行下去。

 

 

 

 

你可能感兴趣的:(android)