开发中有些地方未注意可能造成异常抛出未能caught到,然后弹出系统对话框强制退出。这种交互不好,而且开发者也不能及时获取到底哪里出问题,当然可以接入第三方Crash分析平台比如Bugly、instabug,其实也可以自己很简单的实现全局异常处理。
未捕获异常大多发生在在多线程环境中,子线程抛出的异常是不能用主线程中try….catch捕获。可以给线程设置UncaughtExceptionHandler,当出现异常时会回调UncaughtExceptionHandler中的uncaughtException(Thread t, Throwable e) 方法。
设置可以为某个线程单独设 这个可以在activity中给某个特定的线程设置 只对当前thread起作用
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
当想给所有线程设置时使用 这个可以设置在appliction的oncreat里面 对全局起作用
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
然后MyUncaughtExceptionHandler是一个自定义的内部类 如果有需要也可以自己实现一个外部类 丰富里面的方法 保存log 自启 上传log 弹窗提示 直接退出 都可以自己实现 留给自己的操作空间非常大 可以实现完美退出
private class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//todo
}
}
下面附上application声明周期介绍 以供参考 有需要的话 可以组合使用 下过可能会更好
public class LifeCycleApplication extends Application {
private static String TAG = "LifeCycleApplication";
@Override
public void onCreate() {
// 程序创建的时候执行
Log.d(TAG, "onCreate");
super.onCreate();
}
@Override
public void onTerminate() {
// 程序终止的时候执行
Log.d(TAG, "onTerminate");
super.onTerminate();
}
@Override
public void onLowMemory() {
// 低内存的时候执行
Log.d(TAG, "onLowMemory");
super.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
// 程序在内存清理的时候执行(回收内存)
// HOME键退出应用程序、长按MENU键,打开Recent TASK都会执行
Log.d(TAG, "onTrimMemory");
super.onTrimMemory(level);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.d(TAG, "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
}
}