Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206658
  • 博文数量: 20
  • 博客积分: 1380
  • 博客等级: 中尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-28 14:52
文章分类
文章存档

2017年(2)

2014年(3)

2013年(1)

2009年(1)

2008年(1)

2007年(12)

我的朋友

分类: Android平台

2014-05-20 14:52:29

    从2013年因工作需要,开始对Android做研究,期间遇到过很多问题,但都没有及时作笔记.从今天起作个笔记,留做备用.

   今天先记录一下捕捉异常有用的一个用法.
   刚开始写程序,总会因为一些异常未能捕捉而跳出程序,这时如果有这个类会很有帮助,而且可以尝试把错误记录下来,写在SD卡上,以便研究.
   具体用法如下:
   1 先实例化用于处理未捕捉异常的类,我命名为CrashHandler
      public class CrashHandler implements UncaughtExceptionHandler {    //实现UncaughtExceptionHandler接口
             private String TAG = "CrashHandler";
             private static CrashHandler INSTANCE = new CrashHandler();
             private Context mContext;
             private Thread.UncaughtExceptionHandler mDefaultHandler;

             private CrashHandler()
            {

            }

            public static CrashHandler getInstance()       //实现单例模式
            {
                return INSTANCE;
            }

             public void init(Context context)
             {
                 mContext = context;
                 //获取系统默认的UncaughtExceptionHandler
                 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
                 //设置当前CrashHandler为程序默认处理器
                 Thread.setDefaultUncaughtExceptionHandler(this);
             }


             @Override              //处理未接收的异常
             public void uncaughtException(Thread thread, Throwable e)
            {
                  // TODO Auto-generated method stub
                  if (!handleException(e) && mDefaultHandler != null) {
                      mDefaultHandler.uncaughtException(thread, e);
                  } else {
                      try {
                         Thread.sleep(3000);
                      } catch (InterruptedException ex) {
                          ex.printStackTrace();
                      }
       
                      //退出或重启
                      android.os.Process.killProcess(android.os.Process.myPid());
                      System.exit(1);
       
                     /*
                     Intent intent = new Intent();
                     intent.setClass(mContext, PhoneChainActivity.class);
                     intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
                     mContext.startActivity(intent);
                     android.os.Process.killProcess(android.os.Process.myPid());
                     */
                 }
           }

          /** 
              * 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成 
              *  
              * @param ex 
              * @return true:如果处理了该异常信息;否则返回 false 
              */  
           private boolean handleException(Throwable ex) 
          {  
               if (ex == null) {  
                   return false;  
               }  
               // 使用 Toast 来显示异常信息  
              new Thread() {  
                  @Override  
                   public void run() {  
                       Looper.prepare();  
                       Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show();  
                       Looper.loop();  
                  }  
              }.start();  
          
             // 收集设备参数信息  
             collectDeviceInfo(mContext);  
             // 保存日志文件  
             saveCrashInfo2File(ex);  
             return true;  
        }  
          ......
     }

   2 在你的程序中调用它
      在Application类中调动,替换掉原来的处理.
      public class PhoneChainApp extends Application {
          @Override
           public void onCreate() 
           {
                ......
                CrashHandler crashHandler = CrashHandler.getInstance();  
                 crashHandler.init(getApplicationContext());
           }
      }

      这样在程序遇到未处理异常时会先显示"程序要退出"信息之后再退出软件,同时会把信息保留下来,以便寻找BUG.
   
阅读(2069) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~