平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决。当用户在使用app出现崩溃现象时我们需要知道是什么原因,并将原因记录下来上到服务器,这样以后我们就可以知道具体是什么原因了 
##CrashHandler类

用于记录crash原因保存到sd卡中。

public class CrashHandler implements Thread.UncaughtExceptionHandler {    private static final String TAG = "CrashHandler";    private static final boolean DEBUG = true;    //文件路径    private static final String PATH = Environment.getExternalStorageDirectory().getPath() +File.separator+ "crash";    private static final String FILE_NAME = "crash";    private static final String FILE_NAME_SUFEIX = ".trace";    private static Thread.UncaughtExceptionHandler mDefaultCrashHandler;    private static CrashHandler mCrashHandler = new CrashHandler();    private Context mContext;    private CrashHandler() {    }    public static CrashHandler getInstance() {        return mCrashHandler;    }    public void init(Context context) {        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();        Thread.setDefaultUncaughtExceptionHandler(this);        mContext = context.getApplicationContext();    }    @Override    public void uncaughtException(Thread thread, Throwable ex) {        try {            //将文件写入sd卡            writeToSDcard(ex);            //写入后在这里可以进行上传操作        } catch (IOException e) {            e.printStackTrace();        } catch (PackageManager.NameNotFoundException e) {            e.printStackTrace();        }        ex.printStackTrace();        //如果系统提供了默认异常处理就交给系统进行处理,否则自己进行处理。        if (mDefaultCrashHandler != null) {            mDefaultCrashHandler.uncaughtException(thread, ex);        } else {            Process.killProcess(Process.myPid());        }    }    //将异常写入文件    private void writeToSDcard(Throwable ex) throws IOException, PackageManager.NameNotFoundException {        //如果没有SD卡,直接返回        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {            return;        }        File filedir = new File(PATH);        if (!filedir.exists()) {            filedir.mkdirs();        }        long currenttime = System.currentTimeMillis();        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(currenttime));        File exfile = new File(PATH +File.separator+FILE_NAME+time + FILE_NAME_SUFEIX);        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(exfile)));        Log.e("错误日志文件路径",""+exfile.getAbsolutePath());        pw.println(time);        PackageManager pm = mContext.getPackageManager();        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);        //当前版本号        pw.println("App Version:" + pi.versionName + "_" + pi.versionCode);        //当前系统        pw.println("OS version:" + Build.VERSION.RELEASE + "_" + Build.VERSION.SDK_INT);        //制造商        pw.println("Vendor:" + Build.MANUFACTURER);        //手机型号        pw.println("Model:" + Build.MODEL);        //CPU架构        pw.println("CPU ABI:" + Build.CPU_ABI);        ex.printStackTrace(pw);        pw.close();    }}

调用

public class BaseApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        CrashHandler crashHandler=CrashHandler.getInstance();        crashHandler.init(this);    }}

测试

 mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                throw  new RuntimeException("抛出一个异常");            }        });

最后记得添加文件权限,并调用BaseApplication

更多相关文章

  1. hook Android系统调用的乐趣和好处
  2. Android的轻量级数据库sqlite、以及文件存取byte数组
  3. Androd 添加新键值
  4. UI效果(9): 屏幕相关操作
  5. HD文件管理器 v0.1.3----- 一款界面简约,功能强大的免费文件管理
  6. Android(安卓)创建自己的签名证书文件keystore,使用signapk.jar为
  7. android 自动检测版本升级
  8. android读SDCard中txt文件中文乱码问题
  9. Android中原始资源、任意xml资源和资产的使用

随机推荐

  1. Android(安卓)Studio入门体验
  2. android下的MVP架构
  3. Android之Adapter用法总结
  4. 深入解析Android关机
  5. Android中利用GridView实现水平和垂直均
  6. Android初学者学习之Android(安卓)屏幕适
  7. Android(安卓)Eclipse关联 android API d
  8. android - AsyncTask的使用
  9. android中AVD的使用
  10. mysql5.6及以下版本如何查询数据库里的js