UncaughtExceptionHandler定制自己的错误日志系统
2017-04-06 15:53
465 查看
Java为我们提供了一个机制,用来捕获并处理在一个线程对象中抛出的未检测异常,以避免程序终止。我们可以通过UncaughtExceptionHandler来实现这种机制。
具体实现:
日志写入sdcard代码:
初始化:
具体实现:
public class CrashManager implements UncaughtExceptionHandler { public static final String TAG = "CrashHandler"; // CrashHandler实例 private static CrashManager instance; // 程序的Context对象 private Application application; // 系统默认的UncaughtException处理类 private UncaughtExceptionHandler mDefaultHandler; /** * 保证只有一个CrashHandler实例 */ private CrashManager(Context context) { application = (Application) context.getApplicationContext(); mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } /** * 获取CrashHandler实例 ,单例模式 */ public static CrashManager getInstance(Context context) { CrashManager inst = instance; if (inst == null) { synchronized (CrashManager.class) { inst = instance; if (inst == null) { inst = new CrashManager(context.getApplicationContext()); instance = inst; } } } return inst; } /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public void uncaughtException(Thread thread, Throwable ex) { TaskManager.getInstance(application).saveErrorLog(ex); mDefaultHandler.uncaughtException(thread, ex); } }
日志写入sdcard代码:
public class SaveErrorTask<T> extends Task<Object, Object, Void> { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.CHINA); private Context context; private Throwable ex; public SaveErrorTask(Context context, Throwable ex) { setPriority(TaskPriority.UI_LOW); this.context = context; this.ex = ex; } @Override protected Void doInBackground(Object... arg0) { 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(); String time = formatter.format(new Date()); String fileName = time + ".txt"; StringBuilder stringBuffer = new StringBuilder(); DeviceInfo deviceInfo = Utils.getDeviceInfo(context); stringBuffer.append("\nsdkVersion:" + deviceInfo.sdkVersion); stringBuffer.append("\nmanufacturer:" + deviceInfo.manufacturer); stringBuffer.append("\nmodel:" + deviceInfo.model); stringBuffer.append("\nversion" + ConfigManager.getVersionName(context)); stringBuffer.append("\nerrorStr:" + result); stringBuffer.append("\ntime:" + time); String filePath = CacheFileUtils.getLogPath(fileName); CacheFileUtils.saveErrorStr(filePath, stringBuffer.toString()); return null; } }
初始化:
public class MyApplication extends MultiDexApplication { @Override public void onCreate() { super.onCreate(); //初始化 错误日子系统 CrashManager.getInstance(this); } }
相关文章推荐
- Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统
- Android 使用UncaughtExceptionHandler定制自己的错误日志系统
- Android之UncaughtExceptionHandler定制自己的错误日志系统
- Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统
- Windows2KServer的系统日志中的常见错误收集和解释
- Windows2KServer的系统日志中的常见错误收集和解释
- 系统日志中NetworkX驱动加载错误的解决办法
- 系统日志W32Time错误-NtpClient 配置
- 显示指定的错误页面,同时把错误信息写入系统日志文件
- 用ASP.NET将网页错误信息写入系统日志
- 在系统启动时至少有一个服务器或驱动程序产生错误。详细信息请用事件查看器查看事件日志。
- 在系统启动时至少有一个服务器或驱动程序产生错误。详细信息请用事件查看器查看事件日志。
- stratus 服务器 系统日志报DCOM错误
- 系统日志W32Time错误-NtpClient 配置
- 用ASP.NET将网页错误信息写入系统日志
- Windows2KServer的系统日志中的常见错误收集和解释
- Asp.net 自定义错误处理并写入系统日志
- 用ASP.NET将网页错误信息写入系统日志
- 自己动手做博客之日志管理-1.1 系统分析
- Windows2KServer的系统日志中的常见错误收集和解释