Android 全局异常捕获实例详解

Android 全局异常捕获实例详解,第1张

概述Android全局异常捕获今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于公

AndroID 全局异常捕获

今天就来说说作为程序猿的我们每天都会遇到的东西BUG,出BUG不可怕可怕的是没有出BUG时的堆栈信息,那么对于BUG的信息收集就显得尤为重要了,一般用第三方BUGly或者友盟等等都能轻易收集,但是由于公司不让使用第三方,而安卓正好有原生的异常收集类UncaughtExceptionHandler,那么今天博客就从这个类开始.

UncaughtExceptionHandler见名知意,即他是处理我们未捕获的异常,具体使用分两步

1.实现我们自己的异常处理类

public class CrashHandler implements Thread.UncaughtExceptionHandler {  @OverrIDe  public voID uncaughtException(Thread thread,Throwable ex) {  }}

需要我们实现Thread.UncaughtExceptionHandler接口当有未捕获的异常的时候会回调uncaughtException(Thread thread,Throwable ex)方法

2.设置该CrashHandler为系统默认的

Thread.setDefaultUncaughtExceptionHandler(crashHandler);

以上只是使用步骤的介绍,具体项目中的使用我直接贴代码

在application中初始化

package com.zly.www.basedemo.base;import androID.app.Application;import androID.content.Context;import com.zly.www.basedemo.exception.CrashHandler;/** * Created by zly on 2016/6/11. */public class AppApplication extends Application {  private static Context mContext;  @OverrIDe  public voID onCreate() {    super.onCreate();    this.mContext = this;    CrashHandler.getInstance().init(this);//初始化全局异常管理  }  public static Context getContext(){    return mContext;  }}

CrashHandler 实现类如下

package com.zly.www.basedemo.exception;import androID.content.Context;import androID.content.pm.PackageInfo;import androID.content.pm.PackageManager;import androID.os.Build;import androID.os.Environment;import androID.os.Looper;import androID.util.Log;import androID.Widget.Toast;import com.zly.www.basedemo.utils.AppManager;import java.io.file;import java.io.fileOutputStream;import java.io.PrintWriter;import java.io.StringWriter;import java.io.Writer;import java.lang.reflect.FIEld;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;/** * 全局异常捕获 * Created by zly on 2016/7/3. */public class CrashHandler implements Thread.UncaughtExceptionHandler {  /**   * 系统默认UncaughtExceptionHandler   */  private Thread.UncaughtExceptionHandler mDefaultHandler;  /**   * context   */  private Context mContext;  /**   * 存储异常和参数信息   */  private Map<String,String> paramsMap = new HashMap<>();  /**   * 格式化时间   */  private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");  private String TAG = this.getClass().getSimplename();  private static CrashHandler mInstance;  private CrashHandler() {  }  /**   * 获取CrashHandler实例   */  public static synchronized CrashHandler getInstance(){    if(null == mInstance){      mInstance = new CrashHandler();    }    return mInstance;  }  public voID init(Context context){    mContext = context;    mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();    //设置该CrashHandler为系统默认的    Thread.setDefaultUncaughtExceptionHandler(this);  }  /**   * uncaughtException 回调函数   */  @OverrIDe  public voID uncaughtException(Thread thread,Throwable ex) {    if(!handleException(ex) && mDefaultHandler != null){//如果自己没处理交给系统处理      mDefaultHandler.uncaughtException(thread,ex);    }else{//自己处理      try {//延迟3秒杀进程        Thread.sleep(3000);      } catch (InterruptedException e) {        Log.e(TAG,"error : ",e);      }      //退出程序      AppManager.getAppManager().AppExit(mContext);    }  }  /**   * 收集错误信息.发送到服务器   * @return 处理了该异常返回true,否则false   */  private boolean handleException(Throwable ex) {    if (ex == null) {      return false;    }    //收集设备参数信息    collectDeviceInfo(mContext);    //添加自定义信息    addCustomInfo();    //使用Toast来显示异常信息    new Thread() {      @OverrIDe      public voID run() {        Looper.prepare();        Toast.makeText(mContext,"程序开小差了呢..",Toast.LENGTH_SHORT).show();        Looper.loop();      }    }.start();    //保存日志文件    saveCrashInfo2file(ex);    return true;  }  /**   * 收集设备参数信息   * @param ctx   */  public voID collectDeviceInfo(Context ctx) {    //获取versionname,versionCode    try {      PackageManager pm = ctx.getPackageManager();      PackageInfo pi = pm.getPackageInfo(ctx.getPackagename(),PackageManager.GET_ACTIVITIES);      if (pi != null) {        String versionname = pi.versionname == null ? "null" : pi.versionname;        String versionCode = pi.versionCode + "";        paramsMap.put("versionname",versionname);        paramsMap.put("versionCode",versionCode);      }    } catch (PackageManager.nameNotFoundException e) {      Log.e(TAG,"an error occured when collect package info",e);    }    //获取所有系统信息    FIEld[] fIElds = Build.class.getDeclaredFIElds();    for (FIEld fIEld : fIElds) {      try {        fIEld.setAccessible(true);        paramsMap.put(fIEld.getname(),fIEld.get(null).toString());      } catch (Exception e) {        Log.e(TAG,"an error occured when collect crash info",e);      }    }  }  /**   * 添加自定义参数   */  private voID addCustomInfo() {  }  /**   * 保存错误信息到文件中   *   * @param ex   * @return 返回文件名称,便于将文件传送到服务器   */  private String saveCrashInfo2file(Throwable ex) {    StringBuffer sb = new StringBuffer();    for (Map.Entry<String,String> entry : paramsMap.entrySet()) {      String key = entry.getKey();      String value = entry.getValue();      sb.append(key + "=" + value + "\n");    }    Writer writer = new StringWriter();    PrintWriter printWriter = new PrintWriter(writer);    ex.printstacktrace(printWriter);    Throwable cause = ex.getCause();    while (cause != null) {      cause.printstacktrace(printWriter);      cause = cause.getCause();    }    printWriter.close();    String result = writer.toString();    sb.append(result);    try {      long timestamp = System.currentTimeMillis();      String time = format.format(new Date());      String filename = "crash-" + time + "-" + timestamp + ".log";      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {        String path = Environment.getExternalStorageDirectory().getabsolutePath() + "/crash/";        file dir = new file(path);        if (!dir.exists()) {          dir.mkdirs();        }        fileOutputStream fos = new fileOutputStream(path + filename);        fos.write(sb.toString().getBytes());        fos.close();      }      return filename;    } catch (Exception e) {      Log.e(TAG,"an error occured while writing file...",e);    }    return null;  }}

activity管理类

package com.zly.www.basedemo.utils;import java.util.Stack;import androID.app.Activity; import androID.app.ActivityManager; import androID.content.Context;/** * Activity管理类:用于管理Activity和退出程序 * Created by zly on 2016/6/11. */public class AppManager {   // Activity栈   private static Stack<Activity> activityStack;   // 单例模式   private static AppManager instance;   private AppManager() {   }   /**    * 单一实例    */   public static AppManager getAppManager() {     if (instance == null) {       instance = new AppManager();     }     return instance;   }   /**    * 添加Activity到堆栈    */   public voID addActivity(Activity activity) {     if (activityStack == null) {       activityStack = new Stack<Activity>();     }     activityStack.add(activity);   }   /**    * 获取当前Activity(堆栈中最后一个压入的)    */   public Activity currentActivity() {     Activity activity = activityStack.lastElement();     return activity;   }   /**    * 结束当前Activity(堆栈中最后一个压入的)    */   public voID finishActivity() {     Activity activity = activityStack.lastElement();     finishActivity(activity);   }   /**    * 结束指定的Activity    */   public voID finishActivity(Activity activity) {     if (activity != null) {       activityStack.remove(activity);       activity.finish();       activity = null;     }   }   /**    * 结束指定类名的Activity    */   public voID finishActivity(Class<?> cls) {     for (Activity activity : activityStack) {       if (activity.getClass().equals(cls)) {         finishActivity(activity);        break;      }     }   }   /**    * 结束所有Activity    */   public voID finishAllActivity() {     for (int i = 0; i < activityStack.size(); i++) {       if (null != activityStack.get(i)) {         activityStack.get(i).finish();       }     }     activityStack.clear();   }   /**    * 退出应用程序    */   public voID AppExit(Context context) {     try {       finishAllActivity();       //退出程序      androID.os.Process.killProcess(androID.os.Process.myPID());      System.exit(1);     } catch (Exception e) {     }   } } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Android 全局异常捕获实例详解全部内容,希望文章能够帮你解决Android 全局异常捕获实例详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存