提供一个出现未捕获异常时,显式捕获的类(单例)

本文介绍了一种用于处理Android应用中未捕获异常的单例类实现方式。该类能够捕获并处理应用运行时产生的未捕获异常,避免应用崩溃,并收集异常信息发送给后台。文章提供了完整的代码示例及初始化说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提供一个出现未捕获异常时,显式捕获的类(单例)

使用之前要在 Application类中初始化一下
//        设置出现未捕获异常时的处理类
        CrashHandler.getInstance().init();


/**
 * Created by Administrator on 2016/11/13.
 * 提供一个出现未捕获异常时,显式捕获的类(单例)
 */

public class CrashHandler implements Thread.UncaughtExceptionHandler {
    //    系统默认的未捕获异常的处理器
    public Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;

    //懒汉式
    private CrashHandler() {
    }

    private static CrashHandler instance null;

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

    public void init() {
        defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
//    将当前的类,作为出现未捕获异常时的处理类
        Thread.setDefaultUncaughtExceptionHandler(this);
    }


    //当程序执行过程中,一旦出现未被捕获的异常时,即调用如下的回调方法
    @Override
    public void uncaughtException(Thread thread, final Throwable ex) {
//        处理异常的操作,系统单独提供了一个分线程来执行
        //这是另外一个线程,应该把他放到主线程中执行

        new Thread() {
            public void run() {
//默认情况下,线程是不可以开启Looper进行消息的处理的,除非是主线程,调一下此方法,系统自动让其在主线程中执行
                Looper.prepare();
                Toast.makeText(UIUtils.getContext(), "正在努力修复中...", Toast.LENGTH_SHORT).show();
                Log.e("Tag""出现异常了ex.getMessage());
                Looper.loop();
            }
        }.start();

//        收集用户出现的异常信息,并发送给后台
        collectionException(ex);


        SystemClock.sleep(2000);

//        移除栈空间中所有的activity

        ActivityManager.getInstance().removeAll();
//        结束当前进程
        android.os.Process.killProcess(android.os.Process.myPid());

//        结束当前虚拟机的执行
        System.exit(0);
    }

    private void collectionException(Throwable ex) {
        final String exception = ex.getMessage();
//        收集手机的设备信息 ,信息都封装在build类中
        final String message = Build.DEVICE ":" + Build.MODEL ":" + Build.PRODUCT ":" + Build.VERSION.SDK_INT;

//        模拟打印出来,实际上是联网发送给后台
        new Thread() {
            public void run() {
                Log.e("TAG""exception=" exception ",message=" message);

            }
        }.start();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值