Android的应用程序的异常处理

1.自定义一个类(MaApp)继承Application

2.在清单文件中的Application选项菜单对应的name属性中添加MyApp

3.重写application中的onCreate方法

4.自定义一个类(MyCrashHandler) 实现UncaughtExceptionHandler实现其中的uncaughtException方法

5.将MyCrashHandler 采用单例设计模式 加入同步代码块

6.在MyApp类中的主线程把这个异常捕获设置进去

1 Thread.currentThread().setUncaughtExceptionHandler(MyCrashHandler.getInstance(getApplicationContext()));

7.异常的处理在MyCrashHandler中的uncaughtException中处理

 

上代码

MyApp类

package cn.itcast.crash;
 
 import java.lang.Thread.UncaughtExceptionHandler;
 
 import android.app.Application;
 
 public class MyApp extends Application {
    
 
     /**
      * 应用程序 的进程在第一次被创建的时候 执行的方法
      */
     @Override
     public void onCreate() {
        
         Thread.currentThread().setUncaughtExceptionHandler(MyCrashHandler.getInstance(getApplicationContext()));
        
        
        
         super.onCreate();
     }
 
    
    
 }

MyCrashHandler类

package cn.itcast.crash;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.lang.reflect.Field;
 
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.os.Build;
 import android.os.Environment;
 
 public class MyCrashHandler implements UncaughtExceptionHandler {
     private MyCrashHandler() {
     };
     private static UncaughtExceptionHandler defaultHandler;
     //定义一个系统的默认的异常处理的handler
     private static MyCrashHandler myCrashHandler;
     private static Context mContext;
 
     public synchronized static MyCrashHandler getInstance(Context context) {
         if (myCrashHandler == null) {
             myCrashHandler = new MyCrashHandler();
             mContext = context;
             defaultHandler = Thread.currentThread().getDefaultUncaughtExceptionHandler();
         }
         return myCrashHandler;
     }
 
     /**
      * 当某一个异常 没有代码显示的捕获的时候, 系统会调用 默认的异常处理的代码 处理这个异常
      */
     @Override
     public void uncaughtException(Thread thread, Throwable ex) {
         System.out.println("出现了异常,但是被哥捕获了");
         StringWriter wr = new StringWriter();
         PrintWriter pw = new PrintWriter(wr);
         ex.printStackTrace(pw);
         StringBuilder sb = new StringBuilder();
 
         try {
             PackageInfo packinfo = mContext.getPackageManager().getPackageInfo(
                     mContext.getPackageName(), 0);
             String version = packinfo.versionName;
             sb.append("错误信息:\n");
             sb.append("版本号:" + version + "\n");
 
             String errorlog = wr.toString();
             sb.append(errorlog);
             sb.append("\n");
 
             // 获取当前手机操作系统的信息.
             Field[] fields = Build.class.getDeclaredFields();
             for (Field field : fields) {
                 field.setAccessible(true);// 暴力反射,可以获取私有成员变量的信息
                 String name = field.getName();
                 String value = field.get(null).toString();
                 sb.append(name+"="+value+"\n");
             }
             String time ="time:"+ System.currentTimeMillis();
             sb.append(time);
             String log = sb.toString();
             File file = new File(Environment.getExternalStorageDirectory(),"error.log");
             FileOutputStream fos = new FileOutputStream(file);
             fos.write(log.getBytes());
             fos.flush();
             fos.close();
            
             android.os.Process.killProcess(android.os.Process.myPid());
             //调用系统的默认的异常处理方法 处理这个异常
             defaultHandler.uncaughtException(thread, ex);
            
         } catch (Exception e) {
             e.printStackTrace();
         }
 
     }
 
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值