Android 全局异常捕获
来源:互联网 发布:爱国为主题的电影知乎 编辑:程序博客网 时间:2024/06/06 20:15
全局异常捕获
废话不多说,直接上代码
package com.util;import java.io.PrintWriter;import java.io.StringWriter;import java.io.Writer;import java.lang.Thread.UncaughtExceptionHandler;import android.content.Context;/** * 全局异常捕获句柄类 */public class CrashHandler implements UncaughtExceptionHandler { public static final String TAG = "CrashHandler"; public static final boolean DEBUG = false; // 是否开启日志输出,在Debug状态下开启, // 在Release状态下关闭以提高程序性能 private static CrashHandler crashHandler; private Thread.UncaughtExceptionHandler exceptionHandler; // 系统默认的UncaughtExceptionHandler private Context context; /** * 私有构造函数 */ private CrashHandler() { } /** * @return 单例 */ public static CrashHandler getInstance() { if (crashHandler == null) { crashHandler = new CrashHandler(); } return crashHandler; } /** * @param context * 上下文对象 */ public void init(Context context) { this.context = context; exceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); // 获取系统默认的UncaughtExceptionHandler Thread.setDefaultUncaughtExceptionHandler(this); // 设置本类对象crashHandler为程序的默认处理器 } /** * 当异常发生时,捕获异常 * * @param thread * 线程 * @param ex * 异常 */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(thread, ex) && exceptionHandler != null) { exceptionHandler.uncaughtException(thread, ex); // 如果用户没有处理则让系统默认的异常处理器来处理 } else { try { Thread.sleep(3000); } catch (InterruptedException e) { SLog.Console("===============CrashHandler================"); SLog.saveException(e); SLog.Console("==============CrashHandlerEnd=============="); } } } /** * 自定义异常处理 * * @param ex * 异常 * @return boolean 是否处理 */ private boolean handleException(Thread thread, Throwable ex) { if (ex == null) { return true; } StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true); ex.printStackTrace(pw); pw.flush(); sw.flush(); this.saveInfo2File(ex); // 保存错误报告文件 return true; } /** * 保存异常信息到文件中 * * @param ex * 异常 * @return String 异常信息 */ public String saveInfo2File(final Throwable ex) {// if (MainApplication.getInstance().isTest) {// new Thread(){ // @Override // public void run() { // Looper.prepare(); // String errorMsg=MessageUtils.getExcptionToastMessage(ex);// Toast.makeText(MainApplication.getInstance(), "很抱歉,程序出现"+errorMsg+",即将退出.", // Toast.LENGTH_LONG).show(); // Looper.loop(); // } // }.start(); // } 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(); } String info = writer.toString(); printWriter.close(); FileUtil.saveLog("=================CrashInfo==============="); FileUtil.saveLog(info); SLog.Console(info); FileUtil.saveLog("================CrashInfoEnd============="); return info; }}
然后在MainApplication中添加对应的声明即可
package com.example.zxingdemo;import android.app.Application;import com.util.CrashHandler;import com.util.PathUtil;import com.util.SLog;public class MainApplication extends Application { private static MainApplication mApplication; @Override public void onCreate() { super.onCreate(); mApplication = this; PathUtil.getInstance().init(mApplication); SLog.cleanOutOfDateLog(); // 添加全局异常捕获 CrashHandler crashHandler = CrashHandler.getInstance(); crashHandler.init(getApplicationContext()); } public static synchronized MainApplication getInstance() { return mApplication; }}
最后一定要注意在Manifest里边指定Application
<application android:name="com.example.zxingdemo.MainApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.karics.library.zxing.android.CaptureActivity" android:theme="@android:style/Theme.NoTitleBar" android:screenOrientation="portrait" > </activity> </application>
1 0
- android 捕获全局异常
- android 捕获全局异常
- Android 捕获全局异常
- android 全局异常捕获
- android捕获全局异常
- android捕获全局异常
- android 全局异常 捕获
- Android捕获全局异常
- android 捕获全局异常
- Android全局捕获异常
- android 捕获全局异常
- Android全局异常捕获
- android 全局异常捕获
- Android 全局异常捕获
- Android 全局异常捕获
- Android全局异常捕获
- Android 捕获全局异常
- Android 全局异常捕获
- H5 ios input获取焦点挂起软键盘 输入框被遮盖 页面被顶起
- 使用命令行运行unity并执行某个静态函数(运用于远程打包)
- 邪魔歪道用js系列(1)datagrid编辑器销毁
- RecyclerView(二)——为recyclerView增加header和footer
- 解决安卓上底部使用fixed布局,键盘弹出后fixed部分的内容挡住form表单的情况
- Android 全局异常捕获
- BZOJ 3205 [Apio2013]机器人 斯坦纳树
- unity 时间戳
- Mysql 字符串 varchar 和 char 在存储上的区别
- 数据字典查询数据库中分区字段
- Android Multimedia实战(六)音频 MediaRecorder和AudioRecord录音与MediaPlayer和AudioTrack播放
- C语言:数组中相邻元素持续相加,求其最大值!
- GreenDao的基本使用以及遇到的坑
- centos6.4关闭防火墙步骤