捕获异常信息本地查看或者上传服务器
2016-03-15 15:03
375 查看
app运行在手机上,如果没有连接开发工具,那么报错的时候是看不到异常信息的,下面的这种方法,是把日志保存在手机文件里面,可以通过文件管理器查看,方便了开发者找异常
同时,这种方式也是多数开发者的选择,打印在本地,等下次开启应用并且有网的情况下,再把文件上传给服务器,这样就可以在服务器端很便捷的捕获不同用户的异常了,很方便维护
先写一个如下的类:
然后再Application子类里面: CrashHandler.newsIntance().init(this);
最后在Manifest.xml里面配置自己的Application子类
之后这个应用是可以在sd卡里面的crash文件夹里面找到打印的异常日志信息。
同时,这种方式也是多数开发者的选择,打印在本地,等下次开启应用并且有网的情况下,再把文件上传给服务器,这样就可以在服务器端很便捷的捕获不同用户的异常了,很方便维护
先写一个如下的类:
public class CrashHandler implements Thread.UncaughtExceptionHandler { public static final String TAG = "CrashHandler"; private Context mContext; private static CrashHandler crashHandler; private Thread.UncaughtExceptionHandler defaultHandler; private DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); private Map<String, String> infos = new HashMap<>(); private CrashHandler() { } public static CrashHandler newsIntance() { if (crashHandler == null) { synchronized (CrashHandler.class) { if (crashHandler == null) { crashHandler = new CrashHandler(); } } } return crashHandler; } public void init(Context context) { mContext = context; defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(ex) && defaultHandler != null) { defaultHandler.uncaughtException(thread, ex); }else { defaultHandler.uncaughtException(thread, ex); } } private boolean handleException(Throwable ex) { if (ex == null) { return false; } new Thread(new Runnable() { @Override public void run() { Looper.prepare(); Toast.makeText(mContext, "很抱歉,程序出现异常", Toast.LENGTH_SHORT).show(); Looper.loop(); } }).start(); collectPackageeInfo(); saveCrashInfo2File(ex); return true; } private void collectPackageeInfo() { try { PackageManager pm = mContext.getPackageManager(); PackageInfo packageInfo = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES); if (packageInfo != null) { infos.put("versionName", packageInfo.versionName == null ? "null" : packageInfo.versionName); infos.put("versionCode", packageInfo.versionCode + ""); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } private void saveCrashInfo2File(Throwable ex) { StringBuffer sb = new StringBuffer(); for (Map.Entry<String, String> entry : infos.entrySet()) { sb.append(entry.getKey() + " = " + entry.getValue() + "\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 { String time = format.format(new Date()); String appName = mContext.getResources().getString(R.string.app_name); String fileName = "crash-" + time + "-" + appName + ".log"; String path = Environment.getExternalStorageDirectory() + "/crash/"; File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } FileOutputStream fos = new FileOutputStream(path + fileName); fos.write(sb.toString().getBytes()); fos.close(); } catch (Exception e) { Log.e(TAG, "an error occured while writing file...", e); } } }
然后再Application子类里面: CrashHandler.newsIntance().init(this);
public class QuestionApplication extends Application { @Override public void onCreate() { super.onCreate(); CrashHandler.newsIntance().init(this); } }
最后在Manifest.xml里面配置自己的Application子类
<application xxxx android:name=".QuestionApplication" xxxx>
之后这个应用是可以在sd卡里面的crash文件夹里面找到打印的异常日志信息。
相关文章推荐
- RDK中的Vps_printf()与Vps_rprintf()
- (4.5.2.1)Android Studio教程02-Hello Word
- MySQL数据导出与导入
- Android表情文字EmotionText解析
- spring mvc修改的问题解决思路
- Spring MVC启动时初始化的几个常用方法
- 访客至上的Web、移动可用性设计--指导原则
- c语言:引用指针变量比较两个整数的大小
- android中 页面间的无阻碍传值/接收值
- 字符统计
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
- javascript 常用方法
- 精准的金额类
- 获取屏幕的宽和高-Display中getHeight()和getWidth() 官方废弃
- Week 9:Anomaly Detection课后习题解答
- Linux Jobs等前后台运行命令解
- 用JS判断一个html元素是否存在的五种方法
- 安卓常用名
- 网页设计师
- 3、CSS基础 part-1