zoukankan      html  css  js  c++  java
  • Android系统的“程序异常退出”[转]

     

    在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场。

     

    如何处理未捕获的异常呢?

     

    首先我们要实现一个接口  java.lang.Thread.UncaughtExceptionHandler    ,要实现该接口里面的  uncaughtException(Thread t, Throwable e) ,在这个函数里面,我们可以做一些处理。例如将异常信息保存到sdcard上的某个位置,或者提示用户异常出现等等一些操作。

     

    我们在进入Activity的onCreate函数的时候,设置一下处理未捕获异常 

     

     

     

    1. Thread.setDefaultUncaughtExceptionHandler(  
    2.             new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this)  
    3.         );  



     

     

    发生异常时,做的处理。

     

     

     

    1. public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {  
    2.     private final Context myContext;  
    3.   
    4.     public UncaughtExceptionHandler(Context context) {  
    5.         myContext = context;  
    6.     }  
    7.   
    8.     public void uncaughtException(Thread thread, Throwable exception) {  
    9.         StringWriter stackTrace = new StringWriter();  
    10.         exception.printStackTrace(new PrintWriter(stackTrace));  
    11.         System.err.println(stackTrace);  
    12.   
    13.         Intent intent = new Intent(  
    14.             "android.fbreader.action.CRASH",  
    15.             new Uri.Builder().scheme(exception.getClass().getSimpleName()).build()  
    16.         );  
    17.         try {  
    18.             myContext.startActivity(intent);  
    19.         } catch (ActivityNotFoundException e) {  
    20.             intent = new Intent(myContext, BugReportActivity.class);  
    21.             intent.putExtra(BugReportActivity.STACKTRACE, stackTrace.toString());  
    22.             myContext.startActivity(intent);  
    23.         }  
    24.   
    25.         if (myContext instanceof Activity) {  
    26.             ((Activity)myContext).finish();  
    27.         }  
    28.   
    29.         Process.killProcess(Process.myPid());  
    30.         System.exit(10);  
    31.     }  
    32. }  



     

     

    通过这样的方式,首先能够提高用户体验,避免了强制关闭的问题的发生。更有效的收集异常信息。

     

     

     

     

    //-------------------------------------------------------------------------------

     

     

    继承接口UncaughtExceptionHandler,并重写里面的uncaughtException(Thread thread, Throwable ex)方法,这样就可以监测应用程序的异常情况,做相应的处理: 
    public class myCustomExceptionHandler implements UncaughtExceptionHandler { 

        private UncaughtExceptionHandler defaultUEH; 

        public myCustomExceptionHandler() { 

            this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
        } 

        @Override 
        public void uncaughtException(Thread thread, Throwable ex) { 
            // TODO Auto-generated method stub 
            System.out.println("应用程序异常"); 
            /** 
             * 处理异常,保存异常log或向服务器发送异常报告 
             */ 
            defaultUEH.uncaughtException(thread, ex);; 
        } 
         
    } 
    然后在Activity中加入 Thread.setDefaultUncaughtExceptionHandler(new myCustomExceptionHandler());即可。

    //--------------------------------------------------------------------------------------------------------------

    Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。

    1、异常处理类,代码如下:

    Java代码  收藏代码
    1. public class CrashHandler implements UncaughtExceptionHandler {  
    2.     public static final String TAG = "CrashHandler";  
    3.     private static CrashHandler INSTANCE = new CrashHandler();  
    4.     private Context mContext;  
    5.     private Thread.UncaughtExceptionHandler mDefaultHandler;  
    6.   
    7.     private CrashHandler() {  
    8.     }  
    9.   
    10.     public static CrashHandler getInstance() {  
    11.         return INSTANCE;  
    12.     }  
    13.   
    14.     public void init(Context ctx) {  
    15.         mContext = ctx;  
    16.         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  
    17.         Thread.setDefaultUncaughtExceptionHandler(this);  
    18.     }  
    19.   
    20.     @Override  
    21.     public void uncaughtException(Thread thread, Throwable ex) {  
    22.         // if (!handleException(ex) && mDefaultHandler != null) {  
    23.         // mDefaultHandler.uncaughtException(thread, ex);  
    24.         // } else {  
    25.         // android.os.Process.killProcess(android.os.Process.myPid());  
    26.         // System.exit(10);  
    27.         // }  
    28.         System.out.println("uncaughtException");  
    29.   
    30.         new Thread() {  
    31.             @Override  
    32.             public void run() {  
    33.                 Looper.prepare();  
    34.                 new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)  
    35.                         .setMessage("程序崩溃了...").setNeutralButton("我知道了"new OnClickListener() {  
    36.                             @Override  
    37.                             public void onClick(DialogInterface dialog, int which) {  
    38.                                 System.exit(0);  
    39.                             }  
    40.                         })  
    41.                         .create().show();  
    42.                 Looper.loop();  
    43.             }  
    44.         }.start();  
    45.     }  
    46.   
    47.     /** 
    48.      * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑 
    49.      *  
    50.      * @param ex 
    51.      * @return true:如果处理了该异常信息;否则返回false 
    52.      */  
    53.     private boolean handleException(Throwable ex) {  
    54.         if (ex == null) {  
    55.             return true;  
    56.         }  
    57.         // new Handler(Looper.getMainLooper()).post(new Runnable() {  
    58.         // @Override  
    59.         // public void run() {  
    60.         // new AlertDialog.Builder(mContext).setTitle("提示")  
    61.         // .setMessage("程序崩溃了...").setNeutralButton("我知道了", null)  
    62.         // .create().show();  
    63.         // }  
    64.         // });  
    65.   
    66.         return true;  
    67.     }  
    68. }   

     

    2、线程绑定异常处理类

    Java代码  收藏代码
    1. public class CrashHandlerActivity extends Activity {  
    2.     /** Called when the activity is first created. */  
    3.     @Override  
    4.     public void onCreate(Bundle savedInstanceState) {  
    5.         super.onCreate(savedInstanceState);  
    6.         setContentView(R.layout.main);  
    7.         CrashHandler crashHandler = CrashHandler.getInstance();    
    8.         crashHandler.init(this);  //传入参数必须为Activity,否则AlertDialog将不显示。  
    9.         // 创建错误  
    10.         throw new NullPointerException();  
    11.     }  
    12. }   
  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/fx2008/p/3140801.html
Copyright © 2011-2022 走看看