国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 全局異常捕獲實例詳解

2019-12-12 02:41:14
字體:
來源:轉載
供稿:網友

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) {     }   } } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新昌县| 西青区| 东乌| 文昌市| 阳朔县| 青川县| 蓝山县| 芦山县| 吉林市| 五河县| 鲁山县| 惠安县| 余姚市| 翁牛特旗| 阳高县| 兴安县| 凉城县| 吴旗县| 盐城市| 建湖县| 新宾| 调兵山市| 肃北| 武宁县| 香河县| 卓资县| 邯郸县| 张家口市| 赞皇县| 徐水县| 工布江达县| 高密市| 二手房| 朝阳区| 宾阳县| 洞头县| 临邑县| 隆回县| 巴东县| 汾阳市| 灵寿县|