
本文实例讲述了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信息功能详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)