62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?

1、创建一个类为CrashHandler

  1 import android.content.Context;
  2 import android.os.Looper;
  3 import android.util.Log;
  4 import android.widget.Toast;
  5
  6 import java.text.DateFormat;
  7 import java.text.SimpleDateFormat;
  8 import java.util.Locale;
  9
 10 /**
 11  * author: Created by zzl on 15/11/3.
 12  */
 13 public class CrashHandler implements Thread.UncaughtExceptionHandler {
 14     private static final String TAG = CrashHandler.class.getSimpleName();
 15
 16     private static CrashHandler instance; // 单例模式
 17
 18     private Context context; // 程序Context对象
 19     private Thread.UncaughtExceptionHandler defalutHandler; // 系统默认的UncaughtException处理类
 20     private DateFormat formatter = new SimpleDateFormat(
 21             "yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA);
 22
 23     private CrashHandler() {
 24
 25     }
 26
 27     /**
 28      * 获取CrashHandler实例
 29      *
 30      * @return CrashHandler
 31      */
 32     public static CrashHandler getInstance() {
 33         if (instance == null) {
 34             synchronized (CrashHandler.class) {
 35                 if (instance == null) {
 36                     instance = new CrashHandler();
 37                 }
 38             }
 39         }
 40
 41         return instance;
 42     }
 43
 44     /**
 45      * 异常处理初始化
 46      *
 47      * @param context
 48      */
 49     public void init(Context context) {
 50         this.context = context;
 51         // 获取系统默认的UncaughtException处理器
 52         defalutHandler = Thread.getDefaultUncaughtExceptionHandler();
 53         // 设置该CrashHandler为程序的默认处理器
 54         Thread.setDefaultUncaughtExceptionHandler(this);
 55     }
 56
 57     /**
 58      * 当UncaughtException发生时会转入该函数来处理
 59      */
 60     @Override
 61     public void uncaughtException(Thread thread, Throwable ex) {
 62
 63         // 自定义错误处理
 64         boolean res = handleException(ex);
 65         if (!res && defalutHandler != null) {
 66             // 如果用户没有处理则让系统默认的异常处理器来处理
 67             defalutHandler.uncaughtException(thread, ex);
 68
 69         } else {
 70             try {
 71                 Thread.sleep(3000);
 72             } catch (InterruptedException e) {
 73                 Log.e(TAG, "error : ", e);
 74             }
 75             // 退出程序
 76             //android.os.Process.killProcess(android.os.Process.myPid());
 77             //System.exit(1);
 78         }
 79     }
 80
 81     /**
 82      * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
 83      *
 84      * @param ex
 85      * @return true:如果处理了该异常信息;否则返回false.
 86      */
 87     private boolean handleException(final Throwable ex) {
 88         if (ex == null) {
 89             return false;
 90         }
 91
 92         new Thread() {
 93
 94             @Override
 95             public void run() {
 96                 Looper.prepare();
 97
 98                 ex.printStackTrace();
 99                 String err = "[" + ex.getMessage() + "]";
100                 Toast.makeText(context, "程序出现异常." + err, Toast.LENGTH_LONG)
101                         .show();
102
103                 Looper.loop();
104             }
105
106         }.start();
107
108         // 收集设备参数信息 \日志信息
109         return true;                                                                                                                }
110 }

2、在Application的onCreate()里实例化改crashHandler

1     @Override
2     public void onCreate() {
3         super.onCreate();
4         initInformData();
5         mContext = getApplicationContext();
6         CrashHandler crashHandler = CrashHandler.getInstance();
7         crashHandler.init(mContext);
8
9     }

这样当APP遇到未捕获的异常时,便不会直接闪退,具体怎么处理就看开发者根据业务需要自己处理了。

时间: 2024-10-15 11:06:14

62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?的相关文章

Android全局异常捕捉

// 定义自定义捕捉 package com.xiaosw.test; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.lang.Thread.UncaughtExceptionHandler;

在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如何捕捉全局的异常.基本上在winform或web中捕获全局异常的思路都是一样的,在全局的应用程序对象中添加异常捕获的代码,并写入日志文件中. 一.在Winform程序中捕获全局异常 在winfrom中我们需要了解Application对象中的两个事件 ①Application.ThreadExcep

捕获全局异常UncaughtExceptionHandler

标签:捕获全局异常,UncaughtExceptionHandler ========================网上相关博客======================== 参考:http://blog.csdn.net/jdsjlzx/article/details/7606423 Android自定义捕获Application全局异常 http://git.oschina.net/oschina/android-app 大家可以参考. 大家都知道,现在安装Android系统的手机版本和

C#中的那些全局异常捕获

1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异常由应用程序引发但未进行处理时发生.主要指的是UI线程. this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); //  当某

springboot捕获全局异常和配置多数据源

目录 配置多数据源 写两个数据源的配置类. @(springboot捕获全局异常和配置多数据源) 捕获全局异常是在项目运行期间如果调用的某一个方法出现了运行时异常,则会捕获,并且给出回馈. 首先需要建一个包,包里新建一个捕获异常类GlobalExceptionHandler.前提是springboot的启动类的扫描注解ComponentScan()要扫描到. /** * 用于捕获全局异常 */ @ControllerAdvice//控制器切面 public class GlobalExcepti

Asp.net Core WebApi 全局异常类

通过全局异常类,所有程序中遇到的错误都会被拦截,并友好的返回结果. 1.自定义一个全局异常处理类中间件 using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Threading.Tasks; using Syst

springmvc中拦截器与springmvc全局异常处理器的问题

最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 中抛出了系统自定义异常, 当时有有个疑惑, 就是抛出的这个异常全局异常处理器怎么处理的. 这里的全局异常处理器时通过实现HandlerExceptionResolver这个借口实现的 要指出的是 resolveException方法 中 handler中代表的是什么,我没遇到这个问题之前我认为这玩

Spring-MVC开发之全局异常捕获全面解读(转)

异常,异常.我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个!产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息!在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种: WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法 用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等. SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉,互相没

Android应用捕获全局异常自定义处理

[2016-06-30]最新的全局异常处理DRCrashHandler已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_support_lib/git/tree/master [2016-06-28] 1 增加log4j的支持[2016-06-28] 2 增加全局异常处理(可自定义程序崩溃提示消息,自定义发送错误报告到服务器)[2016-06-28] 3 增加两种应用退出方法:① appExit,结束掉所有Acitiv