62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?
1、创建一个类为CrashHandler
1 import android.content.Context; 2 import android.os.Looper; 3 import android.util.Log; 4 import android.widget.Toast; 5 6 import java.text.DateFormat; 7 import java.text.SimpleDateFormat; 8 import java.util.Locale; 9 10 /** 11 * author: Created by zzl on 15/11/3. 12 */ 13 public class CrashHandler implements Thread.UncaughtExceptionHandler { 14 private static final String TAG = CrashHandler.class.getSimpleName(); 15 16 private static CrashHandler instance; // 单例模式 17 18 private Context context; // 程序Context对象 19 private Thread.UncaughtExceptionHandler defalutHandler; // 系统默认的UncaughtException处理类 20 private DateFormat formatter = new SimpleDateFormat( 21 "yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA); 22 23 private CrashHandler() { 24 25 } 26 27 /** 28 * 获取CrashHandler实例 29 * 30 * @return CrashHandler 31 */ 32 public static CrashHandler getInstance() { 33 if (instance == null) { 34 synchronized (CrashHandler.class) { 35 if (instance == null) { 36 instance = new CrashHandler(); 37 } 38 } 39 } 40 41 return instance; 42 } 43 44 /** 45 * 异常处理初始化 46 * 47 * @param context 48 */ 49 public void init(Context context) { 50 this.context = context; 51 // 获取系统默认的UncaughtException处理器 52 defalutHandler = Thread.getDefaultUncaughtExceptionHandler(); 53 // 设置该CrashHandler为程序的默认处理器 54 Thread.setDefaultUncaughtExceptionHandler(this); 55 } 56 57 /** 58 * 当UncaughtException发生时会转入该函数来处理 59 */ 60 @Override 61 public void uncaughtException(Thread thread, Throwable ex) { 62 63 // 自定义错误处理 64 boolean res = handleException(ex); 65 if (!res && defalutHandler != null) { 66 // 如果用户没有处理则让系统默认的异常处理器来处理 67 defalutHandler.uncaughtException(thread, ex); 68 69 } else { 70 try { 71 Thread.sleep(3000); 72 } catch (InterruptedException e) { 73 Log.e(TAG, "error : ", e); 74 } 75 // 退出程序 76 //android.os.Process.killProcess(android.os.Process.myPid()); 77 //System.exit(1); 78 } 79 } 80 81 /** 82 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 83 * 84 * @param ex 85 * @return true:如果处理了该异常信息;否则返回false. 86 */ 87 private boolean handleException(final Throwable ex) { 88 if (ex == null) { 89 return false; 90 } 91 92 new Thread() { 93 94 @Override 95 public void run() { 96 Looper.prepare(); 97 98 ex.printStackTrace(); 99 String err = "[" + ex.getMessage() + "]"; 100 Toast.makeText(context, "程序出现异常." + err, Toast.LENGTH_LONG) 101 .show(); 102 103 Looper.loop(); 104 } 105 106 }.start(); 107 108 // 收集设备参数信息 \日志信息 109 return true; } 110 }
2、在Application的onCreate()里实例化改crashHandler
1 @Override 2 public void onCreate() { 3 super.onCreate(); 4 initInformData(); 5 mContext = getApplicationContext(); 6 CrashHandler crashHandler = CrashHandler.getInstance(); 7 crashHandler.init(mContext); 8 9 }
这样当APP遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。