Android自定义捕获Application全局异常

转载 2012年03月27日 14:28:07

Android中如果应用出现异常,程序不做处理的话,通常会弹出“强行关闭”对话框,如下:

image

 

为了给用户更好的体验不需要抛出该对话框,需要对异常进行处理,写了一个例子,处理方式是捕获全局异常。工程目录如下:

image

其中CustomApplication是自定义的Application,用来注册全局异常,CustomException用来对异常进行处理,MainActivity中模拟了一个异常。首先看一下CustomApplication代码:

public class CustomApplication extends Application {

    @Override 
    public void onCreate() { 
        
        super.onCreate(); 
        
        CustomException customException = CustomException.getInstance(); 
        
        customException.init(getApplicationContext()); 
    }  
}

继承了Application,同时将CustomException注册到CustomApplication中。

CustomException实现了UncaughtExceptionHandler ,主要代码如下:

public class CustomException implements UncaughtExceptionHandler {

    //获取application 对象; 
    private Context mContext; 
    
    private Thread.UncaughtExceptionHandler defaultExceptionHandler; 
    //单例声明CustomException; 
    private static CustomException customException; 
    
    private CustomException(){        
    } 
    
    public static CustomException getInstance(){ 
        if(customException == null){ 
            customException = new CustomException(); 
        } 
        return customException; 
    } 
    
    @Override 
    public void uncaughtException(Thread thread, Throwable exception) { 
        // TODO Auto-generated method stub 
        if(defaultExceptionHandler != null){ 
            
            Log.e("tag", "exception >>>>>>>"+exception.getLocalizedMessage()); 
            //将异常抛出,则应用会弹出异常对话框.这里先注释掉 
         //   defaultExceptionHandler.uncaughtException(thread, exception); 
            
        } 
    } 
    
     public void init(Context context) {   
            mContext = context;   
            defaultExceptionHandler  = Thread.getDefaultUncaughtExceptionHandler();   
           Thread.setDefaultUncaughtExceptionHandler(this);  

          }

}

其中

public void uncaughtException(Thread thread, Throwable exception) { 
        // TODO Auto-generated method stub 
        if(defaultExceptionHandler != null){ 
            
            Log.e("tag", "exception >>>>>>>"+exception.getLocalizedMessage()); 
            //将异常抛出,则应用会弹出异常对话框.这里先注释掉 
         //   defaultExceptionHandler.uncaughtException(thread, exception); 
            
        } 
    }

对异常作出处理。然后在Mainfest中添加CustomApplication,如下:

<application android:icon="@drawable/icon" android:label="@string/app_name" 
       android:name="CustomApplication">

最后,在MainActivity中抛出异常,代码如下:

public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        
        //模拟异常 
        throw new  RuntimeException("my exception error"); 
    }

程序运行日志结果如下:

image

源代码见:http://bigcateasymorse.googlecode.com/svn/trunk/android_exception_demo/

相关文章推荐

Android——自定义捕获Application全局异常

crash: 崩溃,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是...

Android自定义捕获Application全局异常

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了...

Android自定义捕获Application全局异常(转载)

Java代码 package qianlong.qlmobile.ui;      import java.io.File;   import java.io.FileOutput...

在Android中自定义捕获Application全局异常

现在安装 Android 系统的手机和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开...

Android自定义捕获Application全局异常

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了...

Android自定义捕获Application全局异常

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了...

Android自定义捕获Application全局异常

原文地址 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所...

Android自定义捕获Application全局异常

本文转自:http://gundumw100.iteye.com/blog/1182104   参考:  http://bigcat.easymorse.com/?p=1152  ...

在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框

开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设 备上导致崩溃的信息,这对于下一个版本的 BUG 修复帮助极大,所以今天就来介绍一下如何在程序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)