您的位置:首页 > 其它

捕捉异常有用的方法

2015-06-05 14:17 405 查看
 今天先记录一下捕捉异常有用的一个用法.

   总会因为一些异常未能捕捉而跳出程序,这时如果有这个类会很有帮助,而且可以尝试把错误记录下来,写在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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: