Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统
前言:
每当我们app测试的时候,测试人员总是对我们说这里崩溃了,那里挂掉了!我们只能默默接受,然后尝试着重现bug,更可悲的是有时候bug很难复现,为了解决这种现状所以我们要尝试这建立一个自己的bug日志系统。
实现原理:
Java为我们提供了一个机制,用来捕获并处理在一个线程对象中抛出的未检测异常,以避免程序终止。我们可以通过UncaughtExceptionHandler来实现这种机制。
具体实现:
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性能优化典范第一季
2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...
- [转]Android性能优化典范
2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...
- [Android Pro] Android性能优化典范第一季
reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性 ...
- Android优化—— Google 发布 Android 性能优化典范
阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...
- Android性能优化典范(转)
转载自oschina. 2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍 ...
- Android性能优化典范(二)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
- android app性能优化大汇总(google官方Android性能优化典范 - 第2季)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
- Android性能优化典范 - 第2季
Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓 ...
- Google 发布 Android 性能优化典范
2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有 ...
随机推荐
- VirtualPathProvider的使用
解决的问题,加载数据库中的UI public class Global : System.Web.HttpApplication { protected void Application_Start( ...
- tornado学习笔记19 Tornado框架分析
19.1 Http服务器请求处理流程图 (1) 调用HTTPServer的bind方法,绑定Socket的监听端口号: (2) 调用HTTPServer的listen方法,初始化一个listen so ...
- Nonblocking I/O and select()
This sample program illustrates a server application that uses nonblocking and the select() API. Soc ...
- java分享第十五天(log4j 格式详解)
log4j 格式详解 log4j.rootLogger=日志级别,appender1, appender2, -. 日志级别:ALL<DEBUG<INFO<WARN<ERRO ...
- Java Hashtable的实现
先附源码: package java.util; import java.io.*; /** * This class implements a hash table, which maps keys ...
- JQM开发Tips
1.radio Button 点击后有时候有高亮样式,有时候没有 解决方案: $("#task_form label").click(function () { $("# ...
- 线程处理模型 由于 SynchronizationContext 引起的死锁问题解决
由于GUI 应用程序 不能使用线程池的线程更新UI,只能使用 GUI 线程更新,所以在 await 前后需要保证是同一个 GUI 线程 ASP.NET 程序 的线程处理客户端请求的时候,需要假定客户端 ...
- 使用Gemini构建自己的IDE
你的项目中的领域特定语言是否需要自己的IDE?Visual Studio Shell是选择之一,但是过于庞大不易部署,而且很难使用.Tim Jones的Gemini框架是一个轻量级替代方案. Gemi ...
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...
- ASP.Net请求处理机制初步探索之旅 - Part 2 核心
开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):Ht ...