Android捕获全局异常

程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常

效果图

  • 异常捕获处理前

  • 异常捕获处理后(将程序重新启动)

捕获异常的工具类

package com.example.kongqw.exceptiondemo;

import android.content.Context;
import android.support.v7.internal.app.ToolbarActionBar;
import android.util.Log;
import android.widget.Toast; /**
* Created by kongqw on 2015/11/3.
*/
public class KqwException implements Thread.UncaughtExceptionHandler {
private static KqwException myCrashHandler; private Context mContext; private KqwException(Context context) {
mContext = context;
} public static synchronized KqwException getInstance(Context context) {
if (null == myCrashHandler) {
myCrashHandler = new KqwException(context);
}
return myCrashHandler;
} public void uncaughtException(Thread thread, Throwable throwable) {
long threadId = thread.getId();
String message = throwable.getMessage();
String localizedMessage = throwable.getLocalizedMessage();
Log.i("KqwException", "------------------------------------------------------");
Log.i("KqwException", "threadId = " + threadId);
Log.i("KqwException", "message = " + message);
Log.i("KqwException", "localizedMessage = " + localizedMessage);
Log.i("KqwException", "------------------------------------------------------");
throwable.printStackTrace();
Log.i("KqwException", "------------------------------------------------------"); // TODO 下面捕获到异常以后要做的事情,可以重启应用,获取手机信息上传到服务器等
Log.i("KqwException", "------------------应用被重启----------------");
// 重启应用
mContext.startActivity(mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()));
//干掉当前的程序
android.os.Process.killProcess(android.os.Process.myPid());
}
}

使用

在Application下添加Handler

注册Application

在清单文件下添加name属性

<application
……
android:name=".InitApplication"
…… >
<activity
…… >
<intent-filter>
……
</intent-filter>
</activity>
</application>

Application

package com.example.kongqw.exceptiondemo;

import android.app.Application;

/**
* Created by kongqw on 2015/11/3.
*/
public class InitApplication extends Application { @Override
public void onCreate() {
super.onCreate(); KqwException handler = KqwException.getInstance(this);
Thread.setDefaultUncaughtExceptionHandler(handler);
}
}

测试类

package com.example.kongqw.exceptiondemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } public void bug(View view) {
Toast.makeText(this, "程序崩溃", Toast.LENGTH_SHORT).show();
// 除数为0 导致程序崩溃
int a = 1 / 0;
}
}

XML布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main"> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="bug"
android:text="点击程序崩溃" />
</RelativeLayout>

Android捕获全局异常的更多相关文章

  1. Android应用捕获全局异常自定义处理

    [2016-06-30]最新的全局异常处理DRCrashHandler已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_s ...

  2. 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

    毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...

  3. android中全局异常捕捉

    android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...

  4. SpringBoot捕获全局异常

    1.创建GloableExceptionAop类捕获全局异常 package com.cppdy.exception; import org.springframework.web.bind.anno ...

  5. WebForm 在 Global.asax 中捕获全局异常

    /// <summary> /// 捕获全局异常 /// </summary> /// <param name="sender">sender& ...

  6. C# 捕获全局异常

    一.在Winform程序中捕获全局异常 在winfrom中我们需要了解Application对象中的两个事件 ①Application.ThreadException 事件--当UI线程中某个异常未被 ...

  7. SpringBoot学习笔记(二):SpringBoot访问静态文件、捕获全局异常、集成Thymeleaf、集成JSP

    SpringBoot访问静态文件 什么是静态文件? 不需要通过web容器去得到的文件,直接通过路径就能得到的文件,比如项目的css,js,img等文件. 所有的资源文件都应该在src/main/res ...

  8. Android捕获崩溃异常

    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. ...

  9. C# WinForm捕获全局异常

    网上找的C# WinForm全局异常捕获方法,代码如下: static class Program { /// <summary> /// 应用程序的主入口点. /// </summ ...

随机推荐

  1. LeetCode169:Majority Element(Hash表\位操作未懂)

    题目来源: Given an array of size n, find the majority element. The majority element is the element that ...

  2. [HNOI2008]遥远的行星

    题目描述 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行 ...

  3. ●UOJ58 [WC2013]糖果公园

    题链: http://uoj.ac/problem/58题解: 树上带修莫队. 每个块的大小为$n^{\frac{2}{3}}$,在dfs时,把点集分为若干块. 然后类似序列带修莫队,三个关键字:be ...

  4. ●CodeForces 549F Yura and Developers

    题链: http://codeforces.com/problemset/problem/549/F题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部分 ...

  5. 【vuejs深入二】vue源码解析之一,基础源码结构和htmlParse解析器

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. vuejs是一个优秀的前端mvvm框架,它的易用性和渐进式的理念可以使每一个前端开发人员感到舒服,感到easy.它内 ...

  6. java中JSON转换

    1.JSON介绍 JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符 ...

  7. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...

  8. request.url 端口 错误

    今天遇到一个很奇怪的事情,用request.url.port来获取一个请求的端口,返回是80 ,很纳闷啊我的请求上面是http://www.XX.com:8088 啊,怎么会是80啊,太不可思议了! ...

  9. TypeScript知识点

    TypeScript介绍 TypeScript为JavaScript的超集(ECMAScript6), 这个语言添加了基于类的面向对象编程.TypeScript作为JavaScript很大的一个语法糖 ...

  10. Oracle中打印99乘法表的13种方法

    --实现1: select r1 || '*' || r1 || '=' || r1 * r1 A, decode(r2, '', '', r2 || '*' || r1 || '=' || r2 * ...