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编程模型,程 ...
随机推荐
- windows下载安装requests
1.下载地址:https://github.com/kennethreitz/requests 2.解压缩后,cd requests 3.安装 python setup.py install
- Android学习笔记27:网格视图GridView的使用
网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...
- 括号匹配算法 C语言实现
#include <stdio.h> #include <malloc.h> //malloc,realloc #include <math.h> //含有over ...
- Linux SSH 互信
第一步: 创建用于身份认证的两个密钥文件 ssh-keygen #注明.想省事的话打完这个命令后一直回车就行了. 第二步: 把公钥上传到目标主机上去 ssh-copy-id -i id_rsa.pub ...
- Linux 安装xtrabackup的依赖问题
问题: 尝试安装xtrabackup rpm -ivh percona-xtrabackup-2.2.11-1.el7.x86_64.rpm 报错 perl(DBD::mysql) 被 percona ...
- 如何在程序中动态设置墙纸(使用IActiveDesktop接口)
大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParameter ...
- (11)Xamarin.iOS - 新增iPhone storyboard
原文 Xamarin.iOS - 新增iPhone storyboard 1. 开启Xamarin Studio 并建立新项目 专案类型为 iOS=>iPhone Storyboard => ...
- poj2871
#include <stdio.h> #include <stdlib.h> //法一 int main() { ]; ,tmp; ) { scanf("%lf&qu ...
- [LeetCode][Python]Largest Number
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/largest ...
- Handlebarsjs学习笔记
handlebarsjs官网(http://handlebarsjs.com/) 1.引入模板 在html页面中添加 <script id="entry-template&q ...