android捕获程序异常退出

简介:

今天看到迅雷动漫里面一个CrashHandler 的类,我猜是崩溃处理类。进去一看,果然。顺便学习一下。

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


代码:

public class CrashHandler implements UncaughtExceptionHandler {
    private static final Logger LOG = Logger.getLogger(CrashHandler.class);

    private final Application mApplication;
    private Handler mUIHandler;
    private Thread mUiThread;

    public CrashHandler(Application app) {
        mApplication = app;
        mUIHandler = new Handler();
        mUiThread = Thread.currentThread();
    }

    @Override
    public void uncaughtException(Thread thread, Throwable e) {
        LOG.error(e);
        Throwable cause = e.getCause();
        while (cause != null) {
            LOG.error(cause);
            cause = cause.getCause();
        }

        writeCrashInfoToFile(e);

        if (Thread.currentThread() != mUiThread) {
            mUIHandler.post(new Runnable() {

                @Override
                public void run() {
                    mApplication.onTerminate();
                }
            });
        } else {
            mApplication.onTerminate();
        }
    }

    private void writeCrashInfoToFile(Throwable t) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        t.printStackTrace(pw);
        Throwable cause = t.getCause();
        while (cause != null) {
            cause.printStackTrace(pw);
            cause = cause.getCause();
        }
        String crashInfo = sw.toString();
        pw.close();

        try {
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File file = mApplication.getApplicationContext().getExternalCacheDir();
                if (file != null) {
                    file = FileUtils.getFile(file, "crash");
                    file.mkdirs();
                    FileUtils.writeStringToFile(FileUtils.getFile(file, "crash.log"), crashInfo);
                }
            }
        } catch (IOException e) {
            LOG.warn(e);
        }
    }
}
两个可以看的参考:

http://blog.csdn.net/hehe9737/article/details/7662123

http://blog.csdn.net/wangbole/article/details/8161524

代码是自己的,虽然简单,算我是原创吧。不然,真的很难装逼。哭

相关文章
|
Android开发
Android Studio 点击两次返回键,退出APP
该功能的实现没有特别复杂,主要在onKeyDown()事件中实现,直接上代码,如下:   1 //第一次点击事件发生的时间 2 private long mExitTime; 3 4 /** 5 * 点击两次返回退出app 6 */ 7 @Override 8 public ...
2583 0
|
Android开发
Android中 如何在本Activity页面退出后回到首页或者指定的Activity入口
Android中 如何在本Activity页面退出后回到首页或者指定的Activity入口
1376 0
|
存储 定位技术 API
android退出程序代码!Android开发究竟该如何学习,实战篇
android退出程序代码!Android开发究竟该如何学习,实战篇
android退出程序代码!Android开发究竟该如何学习,实战篇
|
Java Android开发
Android自定义崩溃收集器捕获java层和native层崩溃异常日志
Android自定义崩溃收集器捕获java层和native层崩溃异常日志
278 0
|
监控 Android开发
Android 捕获错误日志(下篇)
前提 昨天写了捕获错误日志的文章,但是没有写上传到服务器的部分,今天就针对上传服务器的部分进行编写和分析,如果没有观看的请先移步到上篇Android 捕获错误日志(上篇)。
1245 0
|
监控 Android开发
Android 捕获错误日志(上篇)
前提 今天在群里聊天的时候有群友问如何捕获错误日志,我说可以自己写,也可以用第三方的比如腾讯的bugly,友盟的错误统计等等,但是那些是别人的东西,作为一个程序员当然是要知其然,并且要知其所以然。
1171 0