Android系统的“程序异常退出”[转]
在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场。
如何处理未捕获的异常呢?
首先我们要实现一个接口 java.lang.Thread.UncaughtExceptionHandler ,要实现该接口里面的 uncaughtException(Thread t, Throwable e) ,在这个函数里面,我们可以做一些处理。例如将异常信息保存到sdcard上的某个位置,或者提示用户异常出现等等一些操作。
我们在进入Activity的onCreate函数的时候,设置一下处理未捕获异常
- Thread.setDefaultUncaughtExceptionHandler(
- new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this)
- );
发生异常时,做的处理。
- public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {
- private final Context myContext;
- public UncaughtExceptionHandler(Context context) {
- myContext = context;
- }
- public void uncaughtException(Thread thread, Throwable exception) {
- StringWriter stackTrace = new StringWriter();
- exception.printStackTrace(new PrintWriter(stackTrace));
- System.err.println(stackTrace);
- Intent intent = new Intent(
- "android.fbreader.action.CRASH",
- new Uri.Builder().scheme(exception.getClass().getSimpleName()).build()
- );
- try {
- myContext.startActivity(intent);
- } catch (ActivityNotFoundException e) {
- intent = new Intent(myContext, BugReportActivity.class);
- intent.putExtra(BugReportActivity.STACKTRACE, stackTrace.toString());
- myContext.startActivity(intent);
- }
- if (myContext instanceof Activity) {
- ((Activity)myContext).finish();
- }
- Process.killProcess(Process.myPid());
- );
- }
- }
通过这样的方式,首先能够提高用户体验,避免了强制关闭的问题的发生。更有效的收集异常信息。
//-------------------------------------------------------------------------------
继承接口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、异常处理类,代码如下:
- 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) {
- );
- }
- })
- .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();
- }
- }
Android系统的“程序异常退出”[转]的更多相关文章
- android捕获程序异常退出
今天看到迅雷动漫里面一个CrashHandler 的类,我猜是崩溃处理类.进去一看.果然.顺便学习一下. Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕 ...
- main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。
读到这里,大家应该了解了main函数返回值的来龙去脉了.下面介绍一下main函数返回值的作用以及如何获得这个返回值.main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出.返回其它 ...
- 程序异常退出 却没有产生core文件
程序异常退出 却没有产生core文件 http://www.cnblogs.com/my_life/articles/4107333.html
- Linux C程序异常退出怎么办——core文件帮你忙
Linux C程序异常退出怎么办——core文件帮你忙 http://blog.csdn.net/zhu2695/article/details/51512138
- .NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象
目 录 1. 现象概述... 1 2. 操作数据库的代码... 2 3. 引起的异常... 2 4. 异常信息分析... 3 5. 分析结 ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- C#WinForm程序异常退出的捕获、继续执行与自动重启
本文参考网上搜索的信息,并做了适当修改可以让捕捉到异常之后阻止程序退出. 另给出了通过命令行自动重启的方法. 如果一个线程里运行下面的代码 ; / a; 将会导致程序自动结束,而且没有任何提示信息 但 ...
- android为应用程序添加退出动画
原本想搞一个退出程序时,把前一个应用程序的VIEW或者截图抓过来为我用,以实现更复杂的动画效果,尝试了很多方法,但都有或多或少的缺陷,可惜最后失败了.不过也算有所得.写文以标记. 其实抓图在4.0以后 ...
- Android入门学习:Android 系统框架及应用程序执行过程
Android基础知识学习 新手上路,还请多多帮助.由于初学,博客内容难免有不正确的地方,还请各位多多指教,相互学习! 主要内容: 1.Android层次架构及主要功能 2.Android编程模型,程 ...
随机推荐
- C语言struct类型
在实际问题中,一组数据往往具有不同的数据类型.例如, 在学生登记表中,姓名应为字符型:学号可为整型或字符型: 年龄应为整型:性别应为字符型:成绩可为整型或实型. 显然不能用一个数组来存放这一组数据. ...
- Orchard 源码探索(Application_Start)之异步委托调用
2014年5月26日 10:26:31 晴 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为ApplicationManager 的类会创建一个应用程序域.应用程序域为全局变量提供应用程 ...
- Oracle EBS-SQL (BOM-1):检查供应类型错误.sql
--检查供应类型错误 SELECT MSI.SEGMENT1 物料编码, MSI.DESCRIPTION 物料描述, DECODE(MSI.WIP ...
- css学习笔记二
下面来总结一下盒子模型,流式布局,浮动布局,层布局(定位布局). 1.盒子模型 有二种:IE盒子模型 和 标准w3c盒子模型 1)IE的盒子模型的content包含了padding和border 2) ...
- 解密:LL与LR解析 2(译,完结)
由于GFW,我无法联系到作者,所以没有授权,瞎翻译的.原文在这里[http://blog.reverberate.org/2013/07/ll-and-lr-parsing-demystified.h ...
- Tip插件的使用
Tip.js概述——美化弹窗插件 开源美化弹窗插件1.JavaScript原生代码2.美化网站用户界面 Tip.js插件的显示效果 Tip.js的使用方法 Tip({ str:'alert上需要弹出显 ...
- Xposed学习
刚接触,不是太懂,就昨天root荣耀6就花了一天时间,其实root早就ok,只是因为Xposed框架总是提示红色警告,以为不好用,后来试了几次发现,跟手机也有很大关系,有的不能很好的支持框架,有的模块 ...
- 基础知识——Cocos2d-x学习历程(三)
1.场景与流程控制 我们把一些内容相对不变的游戏元素集合称作场景(scene),把游戏在场景之间切换的过程叫做流程控制(flow control). 在Cocos2d-x中,场景的实现是Scene. ...
- G - 好老师
G - 好老师 Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit Statu ...
- Java学习之利用集合发牌小练习
/* * 思路: * A:创建一个HashMap集合 * B:创建一个ArrayList集合 * C:创建花色数组和点数数组 * D:从0开始往HashMap里面存储编号,并存储对应的牌同时往Arra ...