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# JSON各种查找法
http://blog.csdn.net/yangxiaojun9238/article/details/8490319
- IE9下报错,错误: “JSON”未定义
今天在公司运行的代码好好的,但是拿回家里以后就报错了 结果是IE9,没有设为兼容模式,唉,微软导出都是坑啊.
- poj2656---求一列数中最大数的序数而且在前面输入的更优先
#include<stdio.h> #include<stdlib.h> int main() { int n,i; while(scanf("%d",&a ...
- Linux中搭建SVN服务器
一 下载工具 1. subversion-1.6.17.tar.gz 2. subversion-deps-1.6.17.tar.gz 二 解压两个包: 1.在此之前,我已经创建了一个用户svnroo ...
- javascript原生ajax;
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy
1 前言 Python有许多IDE能够用,官方自己也带了一个,Eclipse也能够. 但我在使用各种IDE之后,发现用Sublime Text是最好用的一个.因此.我都是用Sublime Text来编 ...
- 2013 多校联合 F Magic Ball Game (hdu 4605)
http://acm.hdu.edu.cn/showproblem.php?pid=4605 Magic Ball Game Time Limit: 10000/5000 MS (Java/Other ...
- Farpoint Spread 常用事件
1 // 单元格编辑结束,焦点离开或者按回车键时 比如:你要判断当前单元格输入内容是否合法.private void fpSpread1_EditModeOff(object sender, Syst ...
- Csharp多态的实现(接口)
1.什么是接口 接口可以看做是一个标准, 所有继承的子类需要按照接口中声明的方法来 接口用关键字 interface 修饰,接口的名字一般是I.........able ,表示我有什么能力 接口一般是 ...
- poj2311
博弈论——sg,mex sg性质:1.在末态的状态点为N态. 2.P态的下一步有一个是N态 3.N态的下一步全部是P态. 当然这是对于单点一个游戏的情形,也相当于NIM只有一堆石子. mex(mini ...