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>

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

最新文章

  1. iOS,多媒体,地图相关
  2. Professional Android Application Development
  3. android studio 中设置apk的版本号
  4. linux 查看端口是否被占用
  5. hdu 4607 Park Visit (dfs)
  6. 基于raw os 的事件触发系统
  7. 记一次-angular-数字格式化
  8. vim全局替换命令
  9. ubuntu+mono+PetaPoco+Oracle+.net 程序部署
  10. 【BZOJ3992】序列统计(动态规划,NTT)
  11. ●BZOJ 3622 已经没有什么好害怕的了
  12. CSS3实现轴心为x轴的3D数字圆环
  13. 推荐安全且匿名的邮箱 ProtonMail -- PGP算法
  14. vue实现简单日历
  15. include指令和&lt;jsp:include&gt;动作标识区别:--不明觉厉 先收藏
  16. linux下不能拼通www.baidu.com
  17. _spellmod_leech_aura
  18. (转)IBM AppScan 安全漏洞问题修复(.net)
  19. ACM~排列组合&amp;amp;&amp;amp;hdu例子
  20. Cannot retrieve the latest commit at this time.

热门文章

  1. 02JavaScript用法
  2. 如何给ioloop.run_sync()中调用的函数传入参数
  3. LCD触屏驱动
  4. ecshop跨站漏洞详情及修补网站漏洞
  5. 利用RabbitMQ、MySQL实现超大用户级别的消息在/离线收发
  6. 22-Consent 确认逻辑实现
  7. Java设计模式(17)——行为模式之观察者模式(Observer)
  8. NoSQL入门第四天——事务与主从复制
  9. Python CSV模块简介
  10. DocX操作word生成报表