android在程序崩溃时Catch异常并处理

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

写一个例子来理解.

1.新建项目,新建一个MyCatchException类,实现uncaughtExceptionHandler.

//全部错误捕捉器

public class MyCatchException implements UncaughtExceptionHandler {

//本类实例

private static MyCatchException mInstance;

//系统默认的uncatchException

private Thread.UncaughtExceptionHandler mDefaultException;

private Context mContext;

//保证只有一个实例

public MyCatchException() {

}

//单例模式

public static MyCatchException getInstance(){

if(mInstance==null){

mInstance=new MyCatchException();

}

return mInstance;

}

//获取系统默认的异常处理器,并且设置本类为系统默认处理器

public void init(Context ctx){

this.mContext=ctx;

mDefaultException=Thread.getDefaultUncaughtExceptionHandler();

Thread.setDefaultUncaughtExceptionHandler(this);

}

//自定义错误处理器

private boolean handlerException(Throwable ex){

if(ex==null){  //如果已经处理过这个Exception,则让系统处理器进行后续关闭处理

return false;

}

//获取错误原因

final String msg = ex.getLocalizedMessage();

new Thread(){

public void run() {

// Toast 显示需要出现在一个线程的消息队列中

Looper.prepare();

Toast.makeText(mContext, "程序出错啦:" + msg, Toast.LENGTH_LONG).show();

Looper.loop();

};

}.start();

return true;

}

@Override

public void uncaughtException(Thread thread, Throwable ex) {

if (!handlerException(ex) && mDefaultException != null) {

// 如果用户没有处理则让系统默认的异常处理器来处理

mDefaultException.uncaughtException(thread, ex);

}

else{ //否则自己进行处理

try {  //Sleep 来让线程停止一会是为了显示Toast信息给用户,然后Kill程序

Thread.sleep(3000);

} catch (InterruptedException e) {

Log.e("info", "Error : ", e);

}

android.os.Process.killProcess(android.os.Process.myPid());

System.exit(10);

}

}

}

2,新建一个MyApplication继承自Application

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

MyCatchException mException=MyCatchException.getInstance();

mException.init(getApplicationContext());  //注册

}

}

3,在MainActivity.java中抛出异常

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

throw new NullPointerException();

}

}

4,另外,为了让MyApplication起作用,还需要在AndroidManifest.xml中声明

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.mycrashdemo"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="14"

android:targetSdkVersion="21" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:name="com.example.mycrashdemo.MyApplication"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

如此,便可以在程序异常崩溃时,做一些处理,提升用户体验

来自为知笔记(Wiz)

时间: 2024-10-21 00:43:53

android在程序崩溃时Catch异常并处理的相关文章

Android记录程序崩溃Log写入文件

将导致程序崩溃的堆栈调用Log写入文件,便于收集bug.在调试安卓程序,由于某些原因调试时手机不能连接PC端,无法通过IDE查看程序崩溃的Log,希望log能够写入文件中,对于已经发布的App可以通过该功能收集Bug. 01import java.io.FileNotFoundException; 02import java.io.FileOutputStream; 03import java.io.IOException; 04import java.io.PrintStream; 05imp

【转】程序崩溃时自动记录minidump的c++类

原帖:程序崩溃时自动记录minidump的c++类 封装了一个C++类,当程序意外崩溃的时候可以生成dump文件,以便确定错误原因. 头文件: //crash_dumper_w32.h #ifndef _CRASH_DUMPER_H_ #define _CRASH_DUMPER_H_ #include <windows.h> class CrashDumper { public: CrashDumper(); ~CrashDumper(); static bool _PlaceHolder()

Android应用程序启动时发生AndroidRuntime : ClassNotFoundException for Activity class的解决方法

在android应用程序启动时抛出下面异常导致启动失败:07-09 17:12:35.709: ERROR/AndroidRuntime(3866): Uncaught handler: thread main exiting due to uncaught exception 07-09 17:12:35.719: ERROR/AndroidRuntime(3866): java.lang.RuntimeException: Unable to instantiate activity Com

当您的应用程序崩溃时,您希望知道所有一切信息

为何应该关心崩溃报告 设想一个用户安装了一个移动应用程序的情况.由于抱有很高的预期,该应用程序被频繁地使用,或许在前几个星期一天使用好几次.应用程序创建的数据以及用户投入该应用程序中的精力在不断积累.然后,突然之间,应用程序崩溃了.用户的数据现在被损坏或丢失.尽管等待了好几天,该应用程序仍未更新,这些问题仍未得到解决.用户为该应用程序提供了一星评价和批评性评论,然后放弃了该应用程序.即使以后某个时刻提供了修复程序,用户也不可能返回再使用该应用程序. 作为应用程序供应商,您投入了数月时间来设计和开

Android应用程序打包时,出现错误:&quot;XXX&quot; is not translated in &quot;af&quot; (Afrikaans), &quot;am&quot; (Amharic), &quot;ar&quot; (Arabic).....

问题:当我们开发完成一个Android应用程序后,在发布该应用程序之前必须要经过的一步时打包应用程序. 至于从打包程序到发布的完整过程可以参考:Android 应用程序发布流程---碗豆荚发布流程 选择Eclipse ADT打包应用程序的过程如下: 可是在这时,会出现如下提示: 并且原本没有错误的程序(values/strings.xml)也会出现如下错误提示: [html] view plaincopy "app_name" is not translated in "af

Android程序Crash时的异常上报

转载请注明来源:http://blog.csdn.net/singwhatiwanna/article/details/17289479 前言 大家都知道,android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户

Android解析程序包时出现问题

Android用户下载我们wcc应用时,偶尔会出现“解析程序包出现问题”的的现象,以下是逐步排查的相关经验: 1. 首先确保这个包本身没有问题. 检测方法:其他手机采用同样的下载方式再下载一次. 解决方案: android系统不支持包名包含中文文件名和全角字母符号,如果在应用程序中使用了,请做修改. android系统不支持包名以大写字母开头,如有请改为小写. 2. 再确保下载的包是完整的,下载过程可能出现apk文件损害,导致没有办法解析. 检测方法:比较下载的apk和服务器的apk size是

&lt;转&gt;关闭 程序崩溃时 windows 正在检查该问题的解决方案

本文转自:http://www.cnblogs.com/dabaopku/archive/2011/07/04/2097029.html 尤其是使用visual studio开发程序 ,自己特意throw一个exception,每次都被它先捕捉到,等上10秒种才轮到vs调试器,甚是烦人. 关闭这个鸡肋的功能很简单,可惜隐藏的太深. 控制面板=>操作中心=>维护右边的箭头,打开隐藏的子窗口=>检查问题报告解决方案 选择设置,选择上那个不推荐设置就行了. 终于可以立即崩溃 了.

C++ 记录Windows程序崩溃时的dumpfile

[原理] windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出,如果这时候没有dump文件的话,我们是没有得到任何程序退出的信息.在windows程序异常退出之前,会预先调用一个在程序中注册的异常处理回调函数(默认是没有设置),只要我们在这个回调函数中调用MiniDumpWriteDump函数就可以产生我们想要的dump文件. [实现] 1.调用SetUnhandledExceptionFilter注册一个自定义的异常处理回调函数 Se