Android中全局异常的捕获

应用的crash是让人很蛋疼的问题,在开发测试的时候还能根据日志输出什么的进行排查修复,但是应用发布以后,用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。所以这时候我们就需要一个能全局捕获异常,并且将这个异常信息上传到服务器的功能,以便根据收集到的异常信息,在后期的版本中进行修复,改善用户体验。

UncaughtExceptionHandler

实现这个功能我们只要自定义一个实现了Thread.UncaughtExceptionHandler接口的异常处理类,并在应用初始化的时候注册这个类就可以了。

public class CrashHandler implements Thread.UncaughtExceptionHandler
{

    private static CrashHandler ourInstance = new CrashHandler();

    public static CrashHandler getInstance()
    {
        return ourInstance;
    }

    private CrashHandler()
    {
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
     //TODO
    }
}

这边呢,我们一般将CrashHandler写成单例模式,重写上面的uncaughtException方法自定义对异常的处理,然后呢,Application或者Activity的onCreate方法里注册这个异常处理类就可以了

Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance());

这边呢再贴一点uncaughtException中处理异常的代码,给大家参考一下

public void uncaughtException(Thread thread, Throwable ex)
{

    
    dumpEx2SdCard(ex);//将错误日志导入到SD卡中
    upEx2server();//将日志上传到服务器
    if (mDefaultHandler != null)
    {
        mDefaultHandler.uncaughtException(thread, ex);
    }
    else
    {
        Process.killProcess(Process.myPid());//做一些退出或者提醒处理
    }
}

private void dumpEx2SdCard(Throwable ex)
{
         //...
        PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)));
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
        ex.printStackTrace(printWriter);
        printWriter.print(ex.getCause());
        printWriter.print(time);
        printWriter.print(ex.getMessage());
        printWriter.print("APP版本:"+ packageInfo.versionName+"_"+packageInfo.versionCode);
        printWriter.print("android 版本:"+ Build.VERSION.RELEASE+"_"+Build.VERSION.SDK_INT);
        printWriter.print("制造商:"+Build.MANUFACTURER);
        //...
}

一般这边的代码都是将错误日志和设备信息写到SD卡中然后再上传到服务器中,具体实现就不贴那么多的代码啦,注重流程就是啦。

开发者服务

集成一些第三方服务可以大大的加快我们的开发速度,诸如此类的统计功能我们只要集成一些像百度云推送,极光推送,友盟+等等的第三方SDK,然后做一些初始化,几行代码就搞定了。而且这些平台提供的各种强大方便的服务,确实是我们开发者的福音。像下图展示的友盟应用管理中心,各种统计功能基本上都能满足我们的需求了。

再推荐一个网站。DevStore 移动互联网企业运营解决方案整合平台这里面总结了各种强大的第三方服务平台,建议收藏哦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,776评论 25 709
  • 《腾讯桌球:客户端总结》 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东...
    吴秦阅读 24,962评论 12 142
  • 其实还是会想念。 人总是很奇怪再分开之后脑子里都是以前的美好。 但是不会再联系。 因为知道当初那个痛哭流涕的自己,...
    Myheng_a3d7阅读 1,410评论 0 0
  • 贾平凹先生的文章只是零零散散的读过,此本书完全出于对标题的喜爱。是的,目前除了王小波和林清玄的书是对于作者的...
    郑欣然阅读 5,366评论 0 0
  • 过几天又要到端午了,两年没有在家过节,很想念那个小山城的那天下午。今年又回不去,又一次只能用回忆来填补想家的...
    羊一豪阅读 2,361评论 2 1