1.Thread.UncaughtExceptionHandler
java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等。如果自己没有try / catch 那么线程就崩溃。
并不能对所有代码都try/catch,如果代码产生了未捕获的异常,又不想让程序崩溃,或者在崩溃之前要做一些收尾工作。怎么办?
Thread.UncaughtExceptionHandler 类可以解决这个问题,当有未捕获异常时,它的 public void uncaughtException(Thread t, Throwable e) 方法会被调用,参数包含了崩溃的线程及相应的异常信息。
Thread类中的 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法指定接收未捕获异常处理类。通常在 Application 里指定一个生命周期很长的未捕获异常处理类。
2.示例
2.1 自定义Thread.UncaughtExceptionHandler
package com.example.uncrash; import android.util.Log; public class CrashHandler implements Thread.UncaughtExceptionHandler { final String TAG = "CrashHandler"; @Override public void uncaughtException(Thread t, Throwable e) { e.printStackTrace(); Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId()); ){ //... } //异常信息收集 //应用程序信息收集 //保存错误报告文件到文件。 } }
2.2 在application里注册
public class UnCrashApplication extends Application { CrashHandler handler; @Override public void onCreate() { super.onCreate(); handler = new CrashHandler(); Thread.setDefaultUncaughtExceptionHandler(handler); } }
2.3 在自定义的线程中注册
private void init(){ new Thread(){ @Override public void run() { setUncaughtExceptionHandler(crashHandler); / ; } }.start(); } public CrashHandler crashHandler = new CrashHandler(); public class CrashHandler implements Thread.UncaughtExceptionHandler { final String TAG = "CrashHandler"; @Override public void uncaughtException(Thread t, Throwable e) { e.printStackTrace(); Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId()); ){ //... } //异常信息收集 //应用程序信息收集 //保存错误报告文件到文件。 } }