Android_MVP之错误异常信息收集处理 CrashHandler
2017-07-21 15:18
453 查看
程序出错开发者应该尽量避免。可设备种类数不胜数,如果出现了错误我们就应该正确收集出现错误异常的相关信息,
下面是本人在开发时写的一种收集方法。
先在Compontent包下创建CrashHandler.java并实现Thread.UncaughtExceptionHandler。
Thread.UncaughtExceptionHandler:线程未捕获异常处理器,用来处理未捕获异常。如果程序出现了未捕获异常,默认会弹出系统中强制关闭对话框。我们需要实现此接口,并注册为程序中默认未捕获异常处理。这样当未捕获异常发生时,就可以做一些个性化的异常处理操作。
CrashHandler.java 代码如下(详情看注释):
因为是MVP的结构我们还要写两个工具类,在util包下创建ToastUtil.java和LogUtil.java两个文件。前面是定义一个通知,告诉用户程序出了问题;后面是获取日志,方便反馈和开发者获得具体的错误情况。
ToastUtil.java 代码如下:
LogUtil.java 代码如下:
最后还要在App包下App.java中初始化:
并且退出程序:
这是我的项目目录:
下面是本人在开发时写的一种收集方法。
先在Compontent包下创建CrashHandler.java并实现Thread.UncaughtExceptionHandler。
Thread.UncaughtExceptionHandler:线程未捕获异常处理器,用来处理未捕获异常。如果程序出现了未捕获异常,默认会弹出系统中强制关闭对话框。我们需要实现此接口,并注册为程序中默认未捕获异常处理。这样当未捕获异常发生时,就可以做一些个性化的异常处理操作。
CrashHandler.java 代码如下(详情看注释):
import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import com.example.chen.news2.app.App; import com.example.chen.news2.util.LogUtil; import com.example.chen.news2.util.ToastUtil; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; /** * Created by chen on 2017/7/21. */ /* * 全局处理异常 * */ public class CrashHandler implements Thread.UncaughtExceptionHandler{ public static Thread.UncaughtExceptionHandler defaultHandler = null; private Context context = null; public final String TAG = CrashHandler.class.getSimpleName(); public CrashHandler(Context context){ this.context = context; } /* * 初始化 * 设置该CrashHander为程序的默认处理器 * */ public static void init(CrashHandler crashHandler){ defaultHandler = Thread.getDefaultUncaugh 4000 tExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(crashHandler); } /* * 未处理异常 * */ @Override public void uncaughtException(Thread thread, Throwable ex) { System.out.println(ex.toString()); LogUtil.e(TAG, ex.toString()); LogUtil.e(TAG, collectCrashDeviceInfo()); LogUtil.e(TAG, getCrashInfo(ex)); //调用系统错误机制 defaultHandler.uncaughtException(thread,ex); ToastUtil.shortShow("抱歉,程序发生异常即将退出"); App.getInstance().exitApp(); } /* * 得到程序崩溃的详细信息 * */ private String getCrashInfo(Throwable ex) { Writer result = new StringWriter(); PrintWriter printWriter = new PrintWriter(result); ex.setStackTrace(ex.getStackTrace()); ex.printStackTrace(printWriter); return result.toString(); } /* * 收集程序崩溃的设备信息*/ private String collectCrashDeviceInfo() { try { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(),PackageManager.GET_ACTIVITIES); String VersionName = packageInfo.versionName; String model = Build.MODEL; String androidVersion = Build.VERSION.RELEASE; String manufacturer = Build.MANUFACTURER; return VersionName + " " + model+ " " + androidVersion + " " + manufacturer; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return null; } }
因为是MVP的结构我们还要写两个工具类,在util包下创建ToastUtil.java和LogUtil.java两个文件。前面是定义一个通知,告诉用户程序出了问题;后面是获取日志,方便反馈和开发者获得具体的错误情况。
ToastUtil.java 代码如下:
package com.example.chen.news2.util; import android.content.Context; import android.view.Gravity; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.example.chen.news2.R; import com.example.chen.news2.app.App; /** * Created by chen on 2017/7/21. */ public class ToastUtil { static ToastUtil td; public static void show(int resId) { show(App.getInstance().getString(resId)); } public static void show(String msg) { if (td == null) { td = new ToastUtil(App.getInstance()); } td.setText(msg); td.create().show(); } public static void shortShow(String msg) { if (td == null) { td = new ToastUtil(App.getInstance()); } td.setText(msg); td.createShort().show(); } Context context; Toast toast; String msg; public ToastUtil(Context context) { this.context = context; } public Toast create() { View contentView = View.inflate(context, R.layout.dialog_toast, null); TextView tvMsg = (TextView) contentView.findViewById(R.id.tv_toast_msg); toast = new Toast(context); toast.setView(contentView); toast.setGravity(Gravity.CENTER, 0, 0); toast.setDuration(Toast.LENGTH_LONG); tvMsg.setText(msg); return toast; } public Toast createShort() { View contentView = View.inflate(context, R.layout.dialog_toast, null); TextView tvMsg = (TextView) contentView.findViewById(R.id.tv_toast_msg); toast = new Toast(context); toast.setView(contentView); toast.setGravity(Gravity.CENTER, 0, 0); toast.setDuration(Toast.LENGTH_SHORT); tvMsg.setText(msg); return toast; } public void show() { if (toast != null) { toast.show(); } } public void setText(String text) { msg = text; } }
LogUtil.java 代码如下:
package com.example.chen.news2.util; import com.orhanobut.logger.BuildConfig; import com.orhanobut.logger.Logger; /** * Created by chen on 2017/7/21. */ public class LogUtil { public static boolean isDebug = BuildConfig.DEBUG; private static final String TAG = "com.example.chen.news2"; public static void e(String tag, Object o) { if(isDebug) { Logger.e(tag, o); } } public static void e(Object o) { LogUtil.e(TAG,o); } public static void w(String tag, Object o) { if(isDebug) { Logger.w(tag, o); } } public static void w(Object o) { LogUtil.w(TAG,o); } public static void d(String msg) { if(isDebug) { Logger.d(msg); } } public static void i(String msg) { if(isDebug) { Logger.i(msg); } } }
最后还要在App包下App.java中初始化:
//初始化日志 Logger.init(getPackageName()).hideThreadInfo();
//初始化错误收集 CrashHandler.init(new CrashHandler(getApplicationContext()));
并且退出程序:
public void exitApp() { if (allActivities != null) { synchronized (allActivities) { for (Activity act : allActivities) { act.finish(); } } } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); }
这是我的项目目录:
相关文章推荐
- 获取手机型号、系统版本号、APP版本号信息(常用语全局异常处理中收集错误信息)
- android异常收集错误信息并保存到crash文件夹下
- android 处理程序全局异常和错误
- android 收集已发布版本的错误信息(UncaughtExceptionHandler)
- android 异常信息The specified child already has a parent. You must call removeView() on the child's parent first. 的处理方法
- python错误处理记录完整的异常堆栈信息
- [错误解决列表]解决异常信息 收集中
- Android中处理崩溃异常 保存错误日志至SD卡中
- SSAS多维数据库处理过程中错误信息及解决方案收集
- Android编程实现捕获程序异常退出时的错误log信息功能详解
- Android错误异常收集
- 项目开发时,出现异常,但控制台没有打印错误信息处理方法
- Android中处理崩溃异常 Android捕获全局异常信息并实现上传
- Android第十四课 Jni函数调用异常获取错误信息
- Android 后台发送邮件 (收集应用异常信息+Demo代码)
- .net Webservice处理异常之SoapException封装-------处理业务流程执行的错误,向客户端返回原始错误信息
- android 控件错误异常收集
- 异常信息:由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribut
- Android程序异常信息收集
- ASP.NET AJAX 异常处理及在客户端显示用户用好的错误信息