关闭

Android自定义捕获Application全局异常

726人阅读 评论(0) 收藏 举报

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/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:148312次
    • 积分:1784
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:156篇
    • 译文:0篇
    • 评论:9条
    文章分类
    最新评论