Android实现捕获未知异常并提交给服务器的方法
作者:llyofdream 发布时间:2022-07-15 23:49:29
标签:Android,捕获异常
本文实例讲述了Android实现捕获未知异常并提交给服务器的方法。分享给大家供大家参考,具体如下:
在Android应用中,即便应用已经投放市场,但有时也会遇到一些未知的异常,此时如果能够获得用户的反馈信息,那么对于我们应用的开发是一个很好的帮助
为了实现这样的效果,我们需要做如下工作
写一个类实现UncaughtExceptionHandler接口,重写uncaughtException方法
功能描述:当应用出现了未知异常,应用强制退出,应用再次启动时,提示用户是否将错误信息反馈给开发者
public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
private static final String TAG = "MyUncaughtExceptionHandler";
// 将错误信息保存到sharepreference中
private static SharedPreferences bugPreferences;
private static SharedPreferences.Editor bugEditor;
private static Context mContext;
private static PackageInfo packageInfo;
private UncaughtExceptionHandler defaultUncaughtExceptionHandler;
private static HandleProgressDialog progressDialog;
// 保存错误原因的字段
private static String bugExistStr = "";
private static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
progressDialog.dismiss();
}
};
public MyUncaughtExceptionHandler(Context context) {
try {
mContext = context;
packageInfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
bugPreferences = context.getSharedPreferences("bug", 0);
bugEditor = bugPreferences.edit();
defaultUncaughtExceptionHandler = Thread
.getDefaultUncaughtExceptionHandler();
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 当异常发生时,会调用这个方法
public void uncaughtException(Thread th, Throwable t) {
try {
// 保存bug
saveBugText(t);
defaultUncaughtExceptionHandler.uncaughtException(th, t);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private void saveBugText(Throwable ex) throws FileNotFoundException {
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
while (cause != null) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
printWriter.close();
bugEditor.putString("bugText", writer.toString());
bugEditor.commit();
}
// 下次开启应用的时候,如果上次产生了未知异常则显示对话框应用与用户反馈
public static void showBugReportDialog(final Context context) {
bugExistStr = context.getSharedPreferences("bug", 0).getString(
"bugText", "");
if (bugExistStr != null && !bugExistStr.equals("")) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.bug_report);
builder.setMessage(R.string.whether_report_to_developer);
builder.setNegativeButton(R.string.cancel, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish(dialog);
}
});
builder.setPositiveButton(R.string.send, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 提交bug到服务器
postBugReportInBackground(context);
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
private static void postBugReportInBackground(final Context context) {
progressDialog = new HandleProgressDialog(context);
progressDialog.show();
new Thread(new Runnable() {
public void run() {
postBugReport();
// 将之前的bug信息清除掉
if (bugExistStr != null) {
bugEditor.putString("bugText", "");
bugEditor.commit();
}
handler.sendEmptyMessage(0);
}
}).start();
}
/**
* Send Bug Report.
*/
private static void postBugReport() {
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("device", Build.DEVICE));
nvps.add(new BasicNameValuePair("model", Build.MODEL));
nvps.add(new BasicNameValuePair("sdk-version", Build.VERSION.SDK));
nvps.add(new BasicNameValuePair("apk-version", packageInfo.versionName));
nvps.add(new BasicNameValuePair("bug", bugExistStr));
try {
HttpPost httpPost = new HttpPost(Constants.BaseUrl
+ "c=main&a=androidCrash");
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);
httpClient.execute(httpPost);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void finish(DialogInterface dialog) {
if (bugExistStr != null) {
bugEditor.putString("bugText", "");
bugEditor.commit();
}
dialog.dismiss();
}
}
在需要捕捉异常的地方调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
appApplication = (APPApplication) getApplication();
appApplication.activites.add(this);
initViews();
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler(
MainActivity.this));
MyUncaughtExceptionHandler.showBugReportDialog(this);
}
希望本文所述对大家Android程序设计有所帮助。


猜你喜欢
- 我们知道现在智能手机上都有这样一种功能,就是你在浏览图片的时候。不是硬性的点击按钮而是可以实现手指的拖动,划开效果。使用户具有更好的交互体验
- 一.需求使用JAVA实现单链表,使用单链表检测字符串是否是回文串二.需求分析回文串最重要的就是对称,那么最重要的问题就是找到那个中心,用快指
- 虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险。 一、为什么要了解内存泄露和内存溢出?1、内存泄
- 一、信号量(Semaphore)信号量(Semaphore)是由内核对象维护的int变量,当信号量为0时,在信号量上等待的线程会堵塞,信号量
- ImGUI 它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,该框架通常会配合特定
- 利用javax.swing.Timer类设计并实现一个模拟秒表功能的应用程序。程序中显示不断递增的时间,同时包含允许用户启动和终止计时功能的
- 本文实例讲述了java GUI编程之布局控制器(Layout)。分享给大家供大家参考,具体如下:布局控制器,是用来系统自动分配各个compo
- 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件
- 观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中。关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然
- 一般数据库的编码是utf8,utf8是不支持存储表情符的,当存入的微信昵称带有表情符时就会出现乱码情况,有两种解决方法:1.mysql数据库
- 楔子近期公司程序被安全扫描出 远程主机允许明文身份验证 中风险漏洞,查了下修复方案,RabbitMQ官方提供了SSL连接方式,而且 Spri
- Java 散列存储Java中散列存储的数据结构主要是指HashSet、HashMap、LinkedHashSet、LinkedHashMap
- 1.XxlJob简介官方网址:https://www.xuxueli.com/xxl-jobXXL-JOB是一个分布式任务调度平台,其核心设
- web.xml中servlet> <servlet-name>SpringMVC</servlet-name>
- 前言使用输入框时产品常常会有一些需求,比如123456789变成123-456-789或者限制一些字符的输入等等。很多时候都是网上搜索就完事
- 一、基本特点1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁
- 介绍Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来减少内存占用和提高性能.Ja
- Android 打开相册选择单张图片实现代码
- java中的interface接口实例详解接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法。java接口
- 先看Demo运行效果SharedPreferences详解SharedPreferences是Android平台上一个轻量级的存储类,用来保