本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
我正在尝试将一个任务提交给Java的ExecutorService。它要么需要一个Callable,它允许抛出异常,要么需要一个Runnable。我的用例是愚蠢的:我想安排一个抛出异常的任务,但它是一个无效的方法。因此,我不能使用Callable或Runnable,因为方法定义与我的用例不匹配。我还想让我的异常从提交后收到的Future传播。有什么想法吗?
我在我们的一个开发环境中得到了以下异常。但是它在另一个环境中工作得很好。无法抓住窍门。有人能帮忙吗?
我有以下情况: 所有代码都在@Transactional内部(传播=传播。REQUIRES_NEW)。基本上,我想调用< code>doSomething,如果它抛出一个异常,设置实体的一个字段,提交,然后再抛出异常。但是,它不起作用,因为事务被标记为回滚。
我一直在致力于实现ServletWrappingController方法,我遇到了一些问题。这是我的配置。。。 我有几个例外... 严重:上下文初始化失败。springframework。豆。工厂BeanCreationException:创建名为“urlMapping”的bean时出错,该bean在ServletContext资源[/WEB-INF/dispatcher servlet.xml]
本文向大家介绍form表单数据封装成json格式并提交给服务器的实现方法,包括了form表单数据封装成json格式并提交给服务器的实现方法的使用技巧和注意事项,需要的朋友参考一下 1、jsp代码,form表单: 2、js代码: 3、后台action处理: 以上这篇form表单数据封装成json格式并提交给服务器的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教
问题内容: 我几乎从来没有玩过客户端方面的东西,而这个大概简单的任务正在踢我的屁股:) 我有一些链接。OnClick我想阻止默认操作,捕获其href网址,向该url提交ajax GET,并简单地添加结果…但是我什至无法越过起始行:) 播放时间锚点示例: 现在,我已经针对SO上的 类似 请求提出了一些建议,但是这些链接仍然会使浏览器导航到href网址。 即使只是 …链接仍然导航到另一页。 我有点像婴