zoukankan      html  css  js  c++  java
  • Android使用UncaughtExceptionHandler捕获全局异常

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

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

    public class CrashHandler implements UncaughtExceptionHandler {
    public static final 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 ctx) {
    mContext = ctx;
    mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(this);
    }
    
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
    // if (!handleException(ex) && mDefaultHandler != null) {
    // mDefaultHandler.uncaughtException(thread, ex);
    // } else {
    // android.os.Process.killProcess(android.os.Process.myPid());
    // System.exit(10);
    // }
    System.out.println("uncaughtException");
    
    new Thread() {
    @Override
    public void run() {
    Looper.prepare();
    new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)
    .setMessage("程序崩溃了...").setNeutralButton("我知道了", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    System.exit(0);
    }
    })
    .create().show();
    Looper.loop();
    }
    }.start();
    }
    
    /**
    * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑
    *
    * @param ex
    * @return true:如果处理了该异常信息;否则返回false
    */
    private boolean handleException(Throwable ex) {
    if (ex == null) {
    return true;
    }
    // new Handler(Looper.getMainLooper()).post(new Runnable() {
    // @Override
    // public void run() {
    // new AlertDialog.Builder(mContext).setTitle("提示")
    // .setMessage("程序崩溃了...").setNeutralButton("我知道了", null)
    // .create().show();
    // }
    // });
    
    return true;
      }
    }

    2、线程绑定异常处理类

    public class CrashHandlerActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    CrashHandler crashHandler = CrashHandler.getInstance(); 
    crashHandler.init(this); //传入参数必须为Activity,否则AlertDialog将不显示。
    // 创建错误
    throw new NullPointerException();
    }
    }
  • 相关阅读:
    shellshock溢出攻击
    内核编译与系统调用
    模块与系统调用
    20199315《Linux内核原理与分析》第十二周作业
    20199315《Linux内核原理与分析》第十一周作业
    Linux下的静态链接库和动态链接库
    2019-2020-1 20199315《Linux内核原理与分析》第九周作业
    2019-2020-1 20199315 《Linux内核原理与分析》 第八周作业
    2019-2020-1 20199315《Linux内核原理与分析》第七周作业
    2019-2020-1 20199315《Linux内核原理与分析》第六周作业
  • 原文地址:https://www.cnblogs.com/yema/p/3573697.html
Copyright © 2011-2022 走看看