android 监测bug上传到服务器,Android实现捕获未知异常并提交给服务器的方法

本文详细介绍了如何在Android应用中创建一个自定义的`UncaughtExceptionHandler`来捕获未知异常,并将错误信息保存到SharedPreferences中。当应用启动时,会检查是否存在未报告的异常,如果存在,则弹出对话框询问用户是否发送错误报告到服务器。通过使用Handler和HttpPost,实现了异常信息的上传。该方法有助于开发者获取用户端的错误信息,以便于改进和优化应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文实例讲述了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 nvps = new ArrayList();

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程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值