您的位置:首页 > 移动开发 > Android开发

Android CrashHandler 自定义崩溃异常捕获

2016-07-04 21:35 696 查看

当APP 异常崩溃时,使用Toast提示,并关闭APP,收集错误信息保存并上报

需求:由于android机型的碎片化,我们在开发时无法对所以机型进行测试,因此在可能的崩溃发生时,我们应当做一些事情来为我们提供更多信息以便改进,同时也能然崩溃发生时的用户体验得到一些改善。例如程序崩溃后的重启APP、系统dialog等并不为我们想要,因此可以在APP崩溃时进行一些处理。由于现在一些第三方提供的崩溃日志的捕获上传做得也不错,对于类似我们这些中小型公司,可以集成如腾讯的Bugly、百度的测试云平台等第三方SDK进行崩溃日志的收集及上传,在我们自定义的CrashHandler里做一些交互处理即可。如使用Toast进行崩溃提示、在崩溃时关掉APP避免重启。

步骤

创建CrashHandler类,继承UncaughtExceptionHandler 接口

编写崩溃处理逻辑

在自定义application中注册CrashHandler

代码块

public class CrashHandler implements Thread.UncaughtExceptionHandler {

private static CrashHandler instance = new CrashHandler();
private Context mContext;

private CrashHandler() {}

public static CrashHandler getInstance() {
return instance;
}

public void setCustomCrashHanler(Context context) {
mContext = context;
//崩溃时将catch住异常
Thread.setDefaultUncaughtExceptionHandler(this);
}

//崩溃时触发
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//使用Toast进行提示
showToast(mContext, "很抱歉,程序异常即将退出!");
//延时退出
try {
thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭APP
Util.exic();
}

//线程中展示Toast
private void showToast(final Context context, final String msg) {
new Thread(new Runnable() {

@Override
public void run() {
Looper.prepare();
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
Looper.loop();
}
}).start();
}
}


在自定义Application的onCreate()函数中注册CrashHandle.

@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.setCustomCrashHanler(getApplicationContext());
......
}


如果是首次自定义Application,别忘了在AndroidManifest.xml中注册。

<application
android:name=".MyApplication"
......


自定义工具类,关闭所有activity以关闭APP。

public class Util {

public static List<Activity> activityList = new LinkedList<Activity>();

public static void addActivity(Activity activity) {
activityList.add(activity);
}

public static void removeActivity(Activity activity) {
if (activityList != null) {
boolean bResult = activityList.remove(activity);
while (bResult) {
bResult = activityList.remove(activity);
}
}
}

public static void exic(){
if (activityList.size() > 0) {
for (Activity activitys : MyActivity.activityList) {
try {
activitys.finish();
} catch (Exception e) {
}
}
}
System.exit(0);
}
}


在自定义的activity基类的onCreate()和onDestroy()中调用。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Util.addActivity(this);
......
}

@Override
protected void onDestroy() {
removeActivity(_this);
......
super.onDestroy();
}


最后在程序的一处写个异常如
int i=1/0;
运行到那里进行异常测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 异常