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

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

概述本文实例讲述了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(); /**  * 获取CrashHandler实例,单例模式。  *  * @return 返回CrashHandler实例  */ 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); }}

在application中的使用非常简单,只要init就好了,之后我们就只要等异常出现吧。

CrashApplication.java

import androID.app.Application;public class CrashApplication extends Application{ @OverrIDe public voID onCreate() {  super.onCreate();  CrashHandler.getInstance().init(this); }}

不要忘记在AndroIDManifest.xml声明我们的CrashApplication 。

AndroIDManifest.xml

<uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE"/><application  androID:allowBackup="true"  androID:name=".CrashApplication"  androID:icon="@drawable/ic_launcher"  androID:label="@string/app_name"  androID:theme="@style/Apptheme" >  <activity   androID:name="com.example.crashtestdemo.MainActivity"   androID:label="@string/app_name" >   <intent-filter>    <action androID:name="androID.intent.action.MAIN" />    <category androID:name="androID.intent.category.LAUNCHER" />   </intent-filter>  </activity></application>

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android编程之activity *** 作技巧总结》、《Android *** 作json格式数据技巧总结》、《Android数据库 *** 作技巧总结》、《Android文件 *** 作技巧汇总》、《Android资源 *** 作技巧汇总》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android编程实现捕获程序异常退出时的错误log信息功能详解全部内容,希望文章能够帮你解决Android编程实现捕获程序异常退出时的错误log信息功能详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1144662.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存