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

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

首先我们要实现一个接口  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. public UncaughtExceptionHandler(Context context) {
  4. myContext = context;
  5. }
  6. public void uncaughtException(Thread thread, Throwable exception) {
  7. StringWriter stackTrace = new StringWriter();
  8. exception.printStackTrace(new PrintWriter(stackTrace));
  9. System.err.println(stackTrace);
  10. Intent intent = new Intent(
  11. "android.fbreader.action.CRASH",
  12. new Uri.Builder().scheme(exception.getClass().getSimpleName()).build()
  13. );
  14. try {
  15. myContext.startActivity(intent);
  16. } catch (ActivityNotFoundException e) {
  17. intent = new Intent(myContext, BugReportActivity.class);
  18. intent.putExtra(BugReportActivity.STACKTRACE, stackTrace.toString());
  19. myContext.startActivity(intent);
  20. }
  21. if (myContext instanceof Activity) {
  22. ((Activity)myContext).finish();
  23. }
  24. Process.killProcess(Process.myPid());
  25. );
  26. }
  27. }

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

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

继承接口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、异常处理类,代码如下:

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

2、线程绑定异常处理类

  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. }

Android系统的“程序异常退出”[转]的更多相关文章

  1. android捕获程序异常退出

    今天看到迅雷动漫里面一个CrashHandler 的类,我猜是崩溃处理类.进去一看.果然.顺便学习一下. Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕 ...

  2. main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。

    读到这里,大家应该了解了main函数返回值的来龙去脉了.下面介绍一下main函数返回值的作用以及如何获得这个返回值.main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出.返回其它 ...

  3. 程序异常退出 却没有产生core文件

    程序异常退出  却没有产生core文件 http://www.cnblogs.com/my_life/articles/4107333.html

  4. Linux C程序异常退出怎么办——core文件帮你忙

    Linux C程序异常退出怎么办——core文件帮你忙 http://blog.csdn.net/zhu2695/article/details/51512138

  5. .NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象

    目       录 1.      现象概述... 1 2.      操作数据库的代码... 2 3.      引起的异常... 2 4.      异常信息分析... 3 5.      分析结 ...

  6. WPF PasswordBox鼠标进入时程序异常退出的解决办法

    最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...

  7. C#WinForm程序异常退出的捕获、继续执行与自动重启

    本文参考网上搜索的信息,并做了适当修改可以让捕捉到异常之后阻止程序退出. 另给出了通过命令行自动重启的方法. 如果一个线程里运行下面的代码 ; / a; 将会导致程序自动结束,而且没有任何提示信息 但 ...

  8. android为应用程序添加退出动画

    原本想搞一个退出程序时,把前一个应用程序的VIEW或者截图抓过来为我用,以实现更复杂的动画效果,尝试了很多方法,但都有或多或少的缺陷,可惜最后失败了.不过也算有所得.写文以标记. 其实抓图在4.0以后 ...

  9. Android入门学习:Android 系统框架及应用程序执行过程

    Android基础知识学习 新手上路,还请多多帮助.由于初学,博客内容难免有不正确的地方,还请各位多多指教,相互学习! 主要内容: 1.Android层次架构及主要功能 2.Android编程模型,程 ...

随机推荐

  1. 读Flask源代码学习Python--config原理

    读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因   莫名其妙在第一份工作中使用了从来没有接 ...

  2. PHP面向对象编程学习之对象基础

    php虽然是一门学习起来非常简单的语言,但是这门语言也包含了对面向对象编程的支持.尤其是随着php5的发布,php对面向对象的支持有了很大的进步.最近学习了一下php的面向对象编程,不禁感慨,面向对象 ...

  3. android一分钟学会可视化操作数据库(无需ROOT)

    我刚开始弄android数据库的时候,想查询一些数据,以验证程序逻辑,发现很多方案都需要ROOT. 即便有不需要ROOT的方案,命令行交互也比较麻烦. 今天跟大家分享一下这个点点鼠标就能实现的功能. ...

  4. Windows Socket I/O模型

    老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里.这和Socket模型非常类似.下面我就以老陈接收信件为例讲解Socket I/O模型~~~ 一:s ...

  5. spring mvc 使用jsr-303进行表单验证的方法介绍

    源代码来源:http://howtodoinjava.com/spring/spring-mvc/spring-bean-validation-example-with-jsr-303-annotat ...

  6. ldap for ruby

    Net::LDAP for Ruby (also called net-ldap) implements client access for the Lightweight Directory Acc ...

  7. genymotion 模拟器 真是牛叉了 速度超快啊!!! 不解释了!建议大家速度去体验一把吧!

    已经有人写了blog了 我就不再赘述了,详情去这里看去吧!!   android genymotion模拟器怎么使用以及和google提供的模拟器性能对比  http://blog.csdn.net/ ...

  8. Java反射-简单应用

    为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...

  9. 从零开始学习UNITY3D(GUI篇 GUI.Window)

    unity3d里面,也是包含window窗体的,下面看一下GUI.Window方法的详情 下面我们用代码实现一个通过开关显示窗体的隐藏和显示的功能,代码如下: public class windows ...

  10. win7环境下安装MongoDB

    1.从http://www.mongodb.org/downloads获取,下载适合windows版本的mongodb,注意32位和64位的区别2.将下载的zip版本,解压到D:/mongodb3.创 ...