美文网首页
Android 捕获异常

Android 捕获异常

作者: 阑珊处等你 | 来源:发表于2019-08-14 15:49 被阅读0次

在市面上有很多异常捕获SDK,比如bugly,友盟等。今天记录一个自定义全局捕获异常功能。

主要用到的是Thread.UncaughtExceptionHandler这个接口。当出现异常时,会回调uncaughtException()方法

@Override

public void uncaughtException(Thread t, Throwable e) {}

参数一:异常出现的线程

参数二:未捕获的异常

可以根据Throwable参数得到异常信息。

代码:

public class CrashHandlerimplements Thread.UncaughtExceptionHandler {

    private static final boolean DEBUG =true;

    private static final FileROOT_FILE = Environment.getExternalStorageDirectory();

    private static final StringFILE_NAME_SUFFIX ="trace.txt";

    private static CrashHandlersInstance =new CrashHandler();

    private Thread.UncaughtExceptionHandleruncaughtExceptionHandler;

    private ContextmContext;

    private CrashHandler() {

}

public static CrashHandlergetsInstance() {

           return sInstance;

    }

public void init(Context context) {

        uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();

         Thread.setDefaultUncaughtExceptionHandler(this);

          mContext = context.getApplicationContext();

    }

/*

当程序中有未被捕获的异常,系统将会自动调用uncaughtException方法

Thread:出现未捕获异常的线程,

Throwable:未捕获的异常

*/

    @Override

public void uncaughtException(Thread t, Throwable e) {

           writeExceptionToSD(e);

            e.printStackTrace();

             if(uncaughtExceptionHandler !=null){

                          uncaughtExceptionHandler.uncaughtException(t,e);

               }else{

                          Process.killProcess(Process.myPid());

               }

}

/*

将异常信息写入文件中

*/

    private void writeExceptionToSD(Throwable ex) {

                   if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

                                 if (DEBUG) {

                                         return;

                                  }

}

File dir =new File(ROOT_FILE,"crashLog");

        if (!dir.exists()) {

                 dir.mkdir();

        }

File file =new File(dir, FILE_NAME_SUFFIX);

        if(!file.exists()){

        try {

                   file.createNewFile();

            }catch (IOException e) {

                     e.printStackTrace();

            }

}

long current = System.currentTimeMillis();

        String time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));

        try {

           PrintWriter pw =new PrintWriter(new BufferedWriter(new FileWriter(file)));

            pw.println(time);

            readPhoneInfo(pw);

            pw.println();

            ex.printStackTrace(pw);

            pw.close();

        }catch (IOException e) {

e.printStackTrace();

        }catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

        }

}

/*

读取手机信息

*/

    private void readPhoneInfo(PrintWriter pw)throws PackageManager.NameNotFoundException {

PackageManager pm =mContext.getPackageManager();

        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);

        pw.print("App Version:");

        pw.print(pi.versionName);

        pw.print("______");

        pw.println(pi.versionCode);

        pw.print("OS Version: ");

        pw.print(Build.VERSION.RELEASE);

        pw.print("______");

        pw.println(Build.VERSION.SDK_INT);

        pw.print("Vendor: ");

        pw.println(Build.MANUFACTURER);

        pw.print("Model: ");

        pw.println(Build.MODEL);

        pw.print("CPU ABI: ");

        pw.println(Build.CPU_ABI);

    }

}

在application中引用

public class TestApplicationextends Application {

@Override

    public void onCreate() {

        super.onCreate();

        CrashHandler crashHandler = CrashHandler.getsInstance();

         crashHandler.init(this);

    }

}

输入:

相关文章

  • Android 如何捕获崩溃异常并重启应用

    第一种方法:通过AppUncaughtExceptionHandler来捕获异常 Android全局捕获崩溃异常记...

  • Android 捕获异常

    在市面上有很多异常捕获SDK,比如bugly,友盟等。今天记录一个自定义全局捕获异常功能。 主要用到的是Threa...

  • android异常捕获

    android异常分为两种,一种是java代码导致的异常,一种是Native异常. 在java代码异常中,主要是出...

  • android so库导致的闪退及tombstone分析

    android中有3种crash情况:未捕获的异常、ANR和闪退。未捕获的异常一般用crash文件就可以记录异常信...

  • Android异常崩溃捕获

    Android系统碎片化造成应用程序崩溃严重,在模拟器上运行良好的程序安装到某款手机上说不定就会出现崩溃的现象。而...

  • Android全局异常捕获

    稳定性测试是保障客户端稳定性的一种手段,致力于提前发现问题,收集更多异常信息,复现线上闪退。当Android客户端...

  • Android全局异常捕获

    重点 1.对未手动捕获异常的处理类 制作成单例类(因为整个应用程序中,只需要一个异常捕获类就够了) 类实例中保存了...

  • android 异常捕获-UncaughtExceptionHa

    在android开发中,异常信息的捕获有多种方式,比如第三方的友盟、蒲公英等,这里主要使用 android 原生的...

  • Android捕获崩溃异常

    由于我们写的代码难免会出现一些bug,以及由于测试环境和生产环境差异导致出现的一些异常,在测试过程中没有发现,而在...

  • android中异常捕获

    刚做android开发的时候,经常会写出很多bug,特别是在测试的时候,如果遇到不能重现的bug,很多问题不好及时...

网友评论

      本文标题:Android 捕获异常

      本文链接:https://www.haomeiwen.com/subject/longjctx.html