anddroid异常处理之UncaughtException
UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.
1.java文件
public class CrashHandler implements Thread.UncaughtExceptionHandler {public static final String TAG = "CrashHandler";// CrashHandler 实例private static CrashHandler INSTANCE = new CrashHandler();// 程序的 Context 对象private Context mContext;// 系统默认的 UncaughtException 处理类private Thread.UncaughtExceptionHandler mDefaultHandler;// 用来存储设备信息和异常信息private Map<String, String> infos = new HashMap<String, String>();// 用于格式化日期,作为日志文件名的一部分private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");/** 保证只有一个 CrashHandler 实例 */private CrashHandler() {}/** 获取 CrashHandler 实例 ,单例模式 */public static CrashHandler getInstance() {return INSTANCE;}/*** 初始化** @param context*/public void init(Context context) {mContext = context;// 获取系统默认的 UncaughtException 处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 设置该 CrashHandler 为程序的默认处理器Thread.setDefaultUncaughtExceptionHandler(this);}/*** 当 UncaughtException 发生时会转入该函数来处理*/@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {// 如果用户没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);} else {try {Thread.sleep(2000);} catch (InterruptedException e) {Log.e(TAG, "error : ", e);}//捕获异常后退出整个应用程序App.application.RemoveActivity();// 结束线程,一般与移除所有Activity配合使用android.os.Process.killProcess(android.os.Process.myPid());// System.exit(0);}}/*** 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成** @param ex* @return true:如果处理了该异常信息;否则返回 false*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}// 使用 Toast 来显示异常信息new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show();Looper.loop();}}.start();// 收集设备参数信息collectDeviceInfo(mContext);// 保存日志文件saveCrashInfo2File(ex);return true;}/*** 收集设备参数信息* @param ctx*/public void collectDeviceInfo(Context ctx) {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 + "";infos.put("versionName", versionName);infos.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);infos.put(field.getName(), field.get(null).toString());Log.d(TAG, field.getName() + " : " + field.get(null));} catch (Exception e) {Log.e(TAG, "an error occured when collect crash info", e);}}}/*** 保存错误信息到文件中** @param ex* @return 返回文件名称,便于将文件传送到服务器*/private String saveCrashInfo2File(Throwable ex) {StringBuffer sb = new StringBuffer();for (Map.Entry<String, String> entry : infos.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 = formatter.format(new Date());String fileName = "crash-" + time + "-" + timestamp + ".log";if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String path = "/sdcard/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;}
}
2.定义自己的application类,进行异常处理CrashHandler 初始化
public class App extends Application {/*** 全局Application,方便调用*/public static App application;public SharedPreferences SP;public SharedPreferences.Editor EDIT;public static List<Activity> list_activity;public void onCreate() {super.onCreate();application = this;list_activity=new ArrayList<Activity>();SP = getSharedPreferences("config", MODE_PRIVATE);EDIT = SP.edit();CrashHandler crashHandler = CrashHandler.getInstance();crashHandler.init(application);}/*** 清空退款任务栈,需要在开启每一个activity之后把其加入到list_activity集合中*/public static void RemoveActivity(){if(!list_activity.isEmpty()){//list集合不为空,移除activityfor(Activity activity: list_activity){activity.finish();}}}}
3.清单文件中声明自己的application类,添加这句话
android:name=”.自己的application类”
anddroid异常处理之UncaughtException相关推荐
- 有的线程它死了,于是它变成一道面试题
来自:why不止技术 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里巴巴的面试说起. 我记得那天是周一,刚刚经历过周末过的放松,干劲十足的我正 ...
- Android处理崩溃的一些实践
对于任何程序来说,崩溃都是一件很难避免的事情,当然Android程序也不例外.在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception ...
- FixedThreadPool吞掉了异常
2019独角兽企业重金招聘Python工程师标准>>> FixedThreadPool吞掉了异常 为了方便遍描述问题,如下是简化后的 public class RunExceptio ...
- 线程执行一半断了_有的线程它死了,于是它变成一道面试题
----本文首发于公众号,关注文末公众号阅读体验更佳 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里的面试说起. 我记得那天是周一,刚刚经历过 ...
- 手机进入Recovery之 RescueParty
文章目录 手机进入Recovery之 RescueParty 1. 案例一:三方内置应用频繁Crash导致Recovery 1.1根据现有的log来看: 1.2分析线索如下: 1.3进入重启的函数调用 ...
- android 弹出框崩溃_Android处理崩溃的一些实践
对于任何程序来说,崩溃都是一件很难避免的事情,当然Android程序也不例外.在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception ...
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理...
本文记录: 1,使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程,讨论了在任务周期执行过程中出现了异常,会导致周期任务失败. 2 ...
- 《高质量java程序设计》读书笔记之----异常处理(1)
"有所为而有所不为".学会java和学好java并用它设计并实现高效率的程序,这两者相去甚远. 异常处理是java中最强大而又最容易误用的机制.很多人只知道大概的异常处理的语法,却 ...
最新文章
- 把文件每行的tab键分隔符改成逗号分隔符
- oracle分页置顶,[置顶] ibatis查询oracle分页
- 很有用的X264和ffmpeg的设置
- 2018蓝桥杯省赛---java---A---1(分数)
- WPF之ComboBox的VisualTreeHelper
- springboot——kaptcha
- python find函数 和index的区别_使用带有find和index的map时Python2和Python3之间的区别...
- ​马卡龙配色你好夏天PPT模板​
- jquery级试题_腾讯2020前端面试题含答案解析
- Windows下MySQL的详细安装教程
- PCI-E 1x, 4x, 8x, 16x 接口定义
- 局域网计算机如何传输文件,局域网文件传输,教您局域网如何传输文件
- 为什么我的电脑只能上qq不能打开网页
- Leveraging Long-Range Temporal Relationships Between Proposals for Video Object Detection论文详读
- 社会工程学(安全牛)
- 线性代数——对向量的线性组合中的“线性”的理解
- 前端自学路线 更新11.11
- 07/12/16 资料整理
- shell(9): shell脚本安装chajian
- 关于博主帅soserious的一些感想.