详解Android全局异常的捕获处理

作者:_Hi_xiaoyu 时间:2023-02-05 09:02:11 

在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug。实现这个功能我们需要依赖于UncaughtExceptionHandler这个类,UncaughtExceptionHandler是一个接口,在Thread中。里面只有一个方法uncaughtException。当我们注册一个UncaughtExceptionHandler之后,当我们的程序crash时就会回调uncaughtException方法,而uncaughtException方法带有两个参数,参数中就存放这crash信息。接下来只看写代码


package hi.xiaoyu.crashhandler;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.Date;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

public class CrashHandler implements UncaughtExceptionHandler {

private static CrashHandler instance;

public static CrashHandler getInstance() {
   if (instance == null) {
     instance = new CrashHandler();
   }
   return instance;
 }

public void init(Context ctx) {
   Thread.setDefaultUncaughtExceptionHandler(this);
 }

/**
  * 核心方法,当程序crash 会回调此方法, Throwable中存放这错误日志
  */
 @Override
 public void uncaughtException(Thread arg0, Throwable arg1) {

String logPath;
   if (Environment.getExternalStorageState().equals(
       Environment.MEDIA_MOUNTED)) {
     logPath = Environment.getExternalStorageDirectory()
         .getAbsolutePath()
         + File.separator
         + File.separator
         + "log";

File file = new File(logPath);
     if (!file.exists()) {
       file.mkdirs();
     }
     try {
       FileWriter fw = new FileWriter(logPath + File.separator
           + "errorlog.log", true);
       fw.write(new Date() + "\n");
       // 错误信息
       // 这里还可以加上当前的系统版本,机型型号 等等信息
       StackTraceElement[] stackTrace = arg1.getStackTrace();
       fw.write(arg1.getMessage() + "\n");
       for (int i = 0; i < stackTrace.length; i++) {
         fw.write("file:" + stackTrace[i].getFileName() + " class:"
             + stackTrace[i].getClassName() + " method:"
             + stackTrace[i].getMethodName() + " line:"
             + stackTrace[i].getLineNumber() + "\n");
       }
       fw.write("\n");
       fw.close();
       // 上传错误信息到服务器
       // uploadToServer();
     } catch (IOException e) {
       Log.e("crash handler", "load file failed...", e.getCause());
     }
   }
   arg1.printStackTrace();
   android.os.Process.killProcess(android.os.Process.myPid());
 }

}

在Activity或者Application中注册一下即可


CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());

这样就实现了Android全局异常的捕获处理,实现过程也比较简单,希望对大家学习Android软件编程有所帮助。

标签:Android,全局异常,捕获
0
投稿

猜你喜欢

  • JavaWeb实现文件上传下载功能实例详解

    2023-05-08 19:43:51
  • 详解SpringBoot迭代发布JAR瘦身配置

    2021-11-14 19:10:48
  • Unity3D Shader实现扫描显示效果

    2023-03-16 22:51:39
  • Java线程并发访问代码分析

    2022-08-15 17:42:08
  • Android实用图文教程之代码混淆、第三方平台加固加密、渠道分发

    2022-06-23 18:12:44
  • 新手入门Jvm-- JVM对象创建与内存分配机制

    2021-11-04 19:28:10
  • 深入理解Java设计模式之代理模式

    2022-01-14 07:42:00
  • 解决RabbitMq消息队列Qos Prefetch消息堵塞问题

    2021-11-17 17:36:13
  • 完美解决java读取大文件内存溢出的问题

    2023-07-31 17:53:17
  • java property配置文件管理工具框架过程详解

    2023-10-12 04:35:50
  • Java 二分查找算法的实现

    2022-07-23 11:10:13
  • 浅谈Java8 判空新写法

    2023-06-21 15:55:08
  • 深入java垃圾回收的详解

    2021-11-19 10:33:06
  • 详述 DB2 分页查询及 Java 实现的示例

    2023-04-21 12:39:12
  • Android用Fragment创建选项卡

    2022-01-12 09:30:36
  • C# 8.0可空引用类型的使用注意记录

    2022-10-03 23:29:40
  • Spring Retry 重试实例详解

    2021-07-15 22:43:26
  • Spring Security入门demo案例

    2023-07-01 18:57:30
  • 关于spring的自定义缓存注解分析

    2023-11-28 17:02:50
  • 带你详细了解Java值传递和引用传递

    2023-02-19 08:42:26
  • asp之家 软件编程 m.aspxhome.com