我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android编程实现捕获程序异常退出时的错误log信息功能详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android编程实现捕获程序异常退出时的错误log信息功能详解

本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能。分享给大家供大家参考,具体如下:

很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误log来查看是什么原因引起的程序崩溃。但是当我们把程序发别人使用时,就没那么好运了,那我们要怎么样才能捕获到那个错误异常呢?还好Android给我们提供了UncaughtExceptionHandler 这个类,我们可以通过实现这个类的接口,来全局捕获那个让程序崩掉的错误log信息。可以将错误的log保存在本地,也可以发送给服务器后台。下面来看下UncaughtExceptionHandler 的实现类CrashHandler吧。

CrashHandler.Java

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.io.StringWriter;import java.io.Writer;import java.lang.Thread.UncaughtExceptionHandler;import java.lang.reflect.Field;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.os.Build;import android.os.Environment;import android.os.Looper;import android.util.Log;import android.widget.Toast;public class CrashHandler implements UncaughtExceptionHandler { private static final String TAG = CrashHandler.class.getSimpleName(); private static final String SINGLE_RETURN = "\n"; private static final String SINGLE_LINE = "--------------------------------"; private static CrashHandler mCrashHandler; private Context mContext; private UncaughtExceptionHandler mDefaultHandler; private StringBuffer mErrorLogBuffer = new StringBuffer();  public static CrashHandler getInstance() {  if (mCrashHandler == null) {   synchronized (CrashHandler.class) {    if (mCrashHandler == null) {     mCrashHandler = new CrashHandler();    }   }  }  return mCrashHandler; } public void init(Context context) {  mContext = context;  // 获取系统默认的uncaughtException处理类实例  mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  // 设置成我们处理uncaughtException的类  Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) {  Log.d(TAG, "uncaughtException:" + ex);  if (!handleException(ex) && mDefaultHandler != null) {   // 如果用户没有处理异常就由系统默认的异常处理器来处理   mDefaultHandler.uncaughtException(thread, ex);  } else {   try {    Thread.sleep(3000);   } catch (InterruptedException e) {    e.printStackTrace();   }   android.os.Process.killProcess(android.os.Process.myPid());  } } //处理异常事件 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();  // 收集设备参数信息  collectDeviceInfo(mContext);  // 收集错误日志  collectCrashInfo(ex);  // 保存错误日志  saveErrorLog();  //TODO: 这里可以加一个网络的请求,发送错误log给后台//  sendErrorLog();  return true; } //保存日志到/mnt/sdcard/AppLog/目录下,文件名已时间yyyy-MM-dd_hh-mm-ss.log的形式保存 private void saveErrorLog() {  if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss", Locale.getDefault());   String format = sdf.format(new Date());   format += ".log";   String path = Environment.getExternalStorageDirectory().getPath()+"/AppLog/";   File file = new File(path);   if (!file.exists()){    file.mkdirs();   }   FileOutputStream fos = null;   try {    fos = new FileOutputStream(path+format);    fos.write(mErrorLogBuffer.toString().getBytes());    fos.flush();   } catch (FileNotFoundException e) {    e.printStackTrace();   } catch (IOException e) {    e.printStackTrace();   } finally {    if (fos != null) {     try {      fos.close();      fos = null;     } catch (IOException e) {      e.printStackTrace();     }    }   }  } } //收集错误信息 private void collectCrashInfo(Throwable ex) {  Writer info = new StringWriter();  PrintWriter printWriter = new PrintWriter(info);  ex.printStackTrace(printWriter);  Throwable cause = ex.getCause();  while (cause != null) {   cause.printStackTrace(printWriter);   cause = cause.getCause();  }  String result = info.toString();  printWriter.close();  //将错误信息加入mErrorLogBuffer中  append("", result);  mErrorLogBuffer.append(SINGLE_LINE + SINGLE_RETURN);  Log.d(TAG, "saveCrashInfo2File:" + mErrorLogBuffer.toString()); } //收集应用和设备信息 private void collectDeviceInfo(Context context) {  //每次使用前,清掉mErrorLogBuffer里的内容  mErrorLogBuffer.setLength(0);  mErrorLogBuffer.append(SINGLE_RETURN + SINGLE_LINE + SINGLE_RETURN);  //获取应用的信息  PackageManager pm = context.getPackageManager();  try {   PackageInfo pi = pm.getPackageInfo(context.getPackageName(),     PackageManager.GET_ACTIVITIES);   if (pi != null) {    append("versionCode", pi.versionCode);    append("versionName", pi.versionName);    append("packageName", pi.packageName);   }  } catch (NameNotFoundException e) {   e.printStackTrace();  }  mErrorLogBuffer.append(SINGLE_LINE + SINGLE_RETURN);  //获取设备的信息  Field[] fields = Build.class.getDeclaredFields();  getDeviceInfoByReflection(fields);  fields = Build.VERSION.class.getDeclaredFields();  getDeviceInfoByReflection(fields);  mErrorLogBuffer.append(SINGLE_LINE + SINGLE_RETURN); } //获取设备的信息通过反射方式 private void getDeviceInfoByReflection(Field[] fields) {  for (Field field : fields) {   try {    field.setAccessible(true);    append(field.getName(), field.get(null));   } catch (IllegalArgumentException e) {    e.printStackTrace();   } catch (IllegalAccessException e) {    e.printStackTrace();   }  } } //mErrorLogBuffer添加友好的log信息 private void append(String key, Object value) {  mErrorLogBuffer.append("" + key + ":" + value + SINGLE_RETURN); }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android编程实现捕获程序异常退出时的错误log信息功能详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android编程实现捕获程序异常退出时的错误log信息功能详解

本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能。分享给大家供大家参考,具体如下:很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误log来查看是什么原因引起的程序崩溃。但是
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录