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

在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软件编程有所帮助。

(0)

相关推荐

  • android教程之hockeyapp捕获异常示例

    复制代码 代码如下: package com.example.testhockeyapp;import net.hockeyapp.android.CrashManager;import net.hockeyapp.android.CrashManagerListener;import net.hockeyapp.android.UpdateManager;import android.os.Bundle;import android.app.Activity;import android.vi

  • Android开发使用UncaughtExceptionHandler捕获全局异常

    在集成了统计SDK(友盟统计,百度统计等)之后,有一个非常有利于测试的功能:错误分析!此功能能够将程序在运行中碰到的崩溃(runtimeException)问题反馈到服务器,帮助开发者改善产品,多适配机器. 然而在公司Android开发中不集成这些SDK,那应该怎么实现这样的功能呢?下面让我们来看下如何使用UncaughtExceptionHandler来捕获异常. 首先实现创建一个类,实现UncaughtExceptionHandler接口.代码如下: 复制代码 代码如下: public cl

  • Android崩溃异常捕获方法

    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. 那么今天主要讲一下如何去捕捉系统出现的Unchecked异常.何为Unchecked异常呢,换句话说就是指非受检异常,它不能用try-catch来显示捕捉. 我们先从Exception讲起.Exception分为两类:一种是CheckedException,一种是UncheckedException

  • android 捕获系统异常并上传日志具体实现

    在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误.但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用UncaughtExceptionHandler捕获全局异常,对异常做出处理.比如我们可以获取到抛出异常的时间.手机的硬件信息.错误的堆栈信息,然后将获取到的所有的信息发送到服务器中,也可以发送到指定的邮件中,以便及时修改bug. 示例: 自定义异常类实现UncaughtExceptionHandler接口,当某个页面出现异常就会调用

  • Android实现捕获未知异常并提交给服务器的方法

    本文实例讲述了Android实现捕获未知异常并提交给服务器的方法.分享给大家供大家参考,具体如下: 在Android应用中,即便应用已经投放市场,但有时也会遇到一些未知的异常,此时如果能够获得用户的反馈信息,那么对于我们应用的开发是一个很好的帮助 为了实现这样的效果,我们需要做如下工作 写一个类实现UncaughtExceptionHandler接口,重写uncaughtException方法 功能描述:当应用出现了未知异常,应用强制退出,应用再次启动时,提示用户是否将错误信息反馈给开发者 pu

  • Android中捕获全局异常实现代码

    1.实现UncaughtExceptionHandler,在方法uncaughtException中处理没有捕获的异常. public class GlobalException implements UncaughtExceptionHandler { private final static GlobalException myCrashHandler = new GlobalException(); private GlobalException() { } public static s

  • Android 捕获运行时异常详解

    Android 捕获运行时异常详解 Android 异常分为两类:CheckedException 和 UnCheckedException CheckException:在编译代码时就需要进行try()catch捕获的. UnCheckException:所有的运行时异常,RuntimeException类和他的子类,都是在APP运行的过程中的发生的.即:APP在运行的过程中崩溃了,这种异常我们就成为运行时异常(比如空指针),当APP崩溃的时候,给用户的体验很不好,所以我们应该捕获这个异常进行

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

    在Android开发中在所难免的会出现程序crash,俗称崩溃.用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug.这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug.实现这个功能我们需要依赖于UncaughtExceptionHandler这个类,UncaughtExceptionHandler是一个接口,在Th

  • 详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    项目中为了实现账号多设备登录的监听 一个账号在别的设备登录时在该设备上需要弹出对话框提示 故而用到全局对话框 方案一. 1.在开发中有时会用到全局弹出对话框但必须在manifest中申请权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 2.创建Dialog AlertDialog.Builder builder=new AlertDialog.Builder(this)

  • Android 全局异常捕获实例详解

    Android 全局异常捕获 今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于公司不让使用第三方,而安卓正好有原生的异常收集类UncaughtExceptionHandler,那么今天博客就从这个类开始. UncaughtExceptionHandler见名知意,即他是处理我们未捕获的异常,具体使用分两步 1.实现我们自己的异常处理类 publi

  • 详解Android封装一个全局的BaseActivity

    1.前言 对于一个Android开发者来说,每一个页面都继承一个单独的系统Activity,有时候会带来很多不必要的困扰.比如:每一个页面会有重复的代码,阅读起来麻烦:每一次写新的页面功能总要打开原来的页面代码拷贝一部分过来:有时候代码调试排查问题也不方便等等. 如果你的项目里面没有将Activity都继承自一个自己封装的BaseActivity.或者针对自己封装的BaseActivity觉得还不够完善的,这篇博客可能会对你有帮助! 2.特点 封装:将所有Activity都用到的一部分代码封装到

  • 详解Android文件描述符

    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统,所以Android也继承了文件描述符系统.我们都知道,在 Linux 中一切皆文件,所以系统在运行时有大量的文件操作,内核为了高效管理已被打开的文件会创建索引,用来指向被打开的文件,这个索引即是文件描述符,其表现形式为一个非负整数. 可以通过命令  ls -la /proc/$pid/fd 查看当

  • 详解Android中获取软键盘状态和软键盘高度

    详解Android中获取软键盘状态和软键盘高度 应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度.这里列举了一些可能的应用场景. 场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一个界面,但部分机型在返回键处理上有bug,按下返回键后,虽然软键盘会自动收起,但不会消费返回事件,导致Activity还会收到这次返回事件,执行回退操作,这时就需要判断,如果软键盘刚刚由显示变为隐藏状态,就不执行回退操作. 场景二 当软键盘弹出后,会将

  • 详解Android中PopupWindow在7.0后适配的解决

    本文介绍了详解Android中PopupWindow在7.0后适配的解决,分享给大家,具体如下: 这里主要记录一次踩坑的经历. 需求:如上图左侧效果,想在按钮的下方弹一个PopupWindow.嗯,很简单一个效果,然当适配7.0后发现这个PopupWindow显示异常,然后网上找到了下面这种方案. 7.0适配方案(但7.1又复现了) // 将popupWindow显示在anchor下方 public void showAsDropDown(PopupWindow popupWindow, Vie

  • 详解Android项目多服务端接口适配(超简单)

    现状 Android项目如果是多服务端接口时,一般怎么弄呢? 方法1:服务器地址放在Header中 把服务器地址放在接口Header中,然后通过拦截器来动态修改请求地址而实现的.除了默认服务器的接口,其它都要加一个Header,有点麻烦.看起来也不爽,不简洁. interface ApiHeaderCase { /************************** server A ****************************/ @Headers("host:$SERVER_HOS

  • 详解Android Bitmap的使用

    一 图片表示原理 图片是由每个像素点来组成 像素点就是小方块 图片的大小等于 宽*高*每个像素点的大小 二 加载图片OOM异常 解决办法 其中big.jpg是一张21.2MB的高清图 public class MainActivity extends AppCompatActivity implements View.OnClickListener { ImageView mImageView; @Override protected void onCreate(Bundle savedInst

  • 详解Android系统启动过程

    计算机是如何启动的 计算机的硬件包括:CPU,内存,硬盘,显卡,显示器,键盘鼠标等输入输出设备.所有的软件都是存放在硬盘中,程序执行时,需要将程序从硬盘上读取到内存中,然后加载到CPU中来运行.当按下开机键时,内存中什么都没有,因此需要借助某种方式,将操作系统加载到内存中,而完成这项任务的就是BIOS. 引导阶段 BIOS:BIOS是主板芯片上的一个程序,计算机通电后,第一件事情就是读取BIOS. BIOS首先进行硬件检测,检查计算机硬件能否满足运行的基本条件.如果硬件出现问题,主板发出不同的蜂

随机推荐