在Android开发中,捕获异常日志,是分析代码BUG的最好方式。
CrashExceptionHander使用步骤
1:新建一个CrashExceptionHander
public class CrashExceptionHander implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
private static CrashExceptionHander INSTANCE = new CrashExceptionHander();
private Context mContext;
//用来存储设备信息和异常信息
private Map<String, String> infos = new HashMap<String, String>();
private String userid = "";
private String version = "";
private String area;
private CrashExceptionHander() {
}
public static CrashExceptionHander getInstance() {
return INSTANCE;
}
public void init(Context ctx) {
mContext = ctx.getApplicationContext();
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//在这里将错误日志保存到本地或者直接传送到服务器
collectDeviceInfo(mContext);
final String msg = saveCrashInfo2File(ex);
LogUtil.save(msg);
new Thread(new Runnable() {
@Override
public void run() {
android.os.Process.killProcess(android.os.Process.myPid());
}
}).start();
}
/**
* 收集设备参数信息
*
* @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);
version = versionName;
}
} catch (Exception e) {
}
Field[] fields = Build.class.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
infos.put(field.getName(), field.get(null).toString());
} catch (Exception 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 + "\r\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);
return sb.toString();
}
2.在使用的Activity中加入
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CrashExceptionHander crashHandler = CrashExceptionHander.getInstance();
crashHandler.init(getApplicationContext());
Thread.setDefaultUncaughtExceptionHandler(crashHandler);
}