更新:请参阅下面的"已接受"解决方案
当我的应用创建未处理的异常,而不是简单地终止时,我想首先让用户有机会发送日志文件.我意识到在获得随机异常后做更多的工作是有风险的,但是,嘿,最糟糕的是应用程序完成崩溃并且日志文件没有被发送.结果比我想象的更棘手:)
什么有效:(1)捕获未捕获的异常,(2)提取日志信息并写入文件.
什么不起作用:(3)开始发送电子邮件的活动.最终,我还有另一项活动要求用户的许可.如果我让电子邮件活动正常工作,我不会对另一方感到麻烦.
问题的关键是我的Application类中捕获了未处理的异常.由于这不是一个Activity,因此如何使用Intent.ACTION_SEND启动活动并不明显.也就是说,通常在启动一个活动时,调用startActivity并使用onActivityResult恢复.Activity支持这些方法,但Application不支持.
有关如何做到这一点的任何建议?
以下是一些代码剪辑作为入门指南:
public class MyApplication extends Application
{
defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
public void onCreate ()
{
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
}
private void handleUncaughtException (Thread thread, Throwable e)
{
String fullFileName = extractLogToFile(); // code not shown
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new …Run Code Online (Sandbox Code Playgroud) 我正在尝试让相机在我的应用程序中运行,而我对整个camera.release()事情都有疑问; 我正在做非常复杂的事情并且没有明确的方式来简单地调用camera.release()所以我必须继续尝试新方法,但每次我弄错了我的应用程序崩溃(如预期的那样),让相机不被释放.因此,为了能够再次测试我的应用程序,我需要重新启动手机才能刷新相机.
有没有办法通过终端或DDMS释放相机,还是通过重新启动手机释放相机的唯一方法?它已经变得很老了,特别是当一个小错误导致浪费时间等待我的手机重新启动时.
谢谢!
有没有办法在我自己的Android应用程序中捕获崩溃?像全局未捕获的异常处理程序?只是想知道我是否可以安装类似的东西,然后如果抛出未捕获的异常,我可以为用户弹出一个对话框,并询问他们是否要将异常转储邮寄给我.
谢谢
这是一个普遍的问题,从具体情况中提出,但我想得到一般答案如何处理以下情况:
背景:
我有一个应用程序,它使用一些第三方库(广告网络提供商SDK - 特别是 - AdMobSDK,基于Google Play Services).该库的功能对于应用程序并不重要.该库创建一个或多个后台工作线程.有时(非常罕见的情况),其中一个后台线程中存在未处理的异常,从而导致应用程序崩溃.我想忽略由此库引起的所有异常,无论其原因如何:在最坏的情况下,应用程序用户将看不到广告 - 它比应用程序崩溃要好得多.
由于库本身创建了后台线程 - 我不能通过try/catch包装它们.
题
有没有办法捕获所有非处理后台(非主要)线程异常,只是为了在这种情况下杀死线程,并防止应用程序崩溃?
相关问题
我看到了很多的几个问题,但有些过于具体(而不是覆盖我的情况),其他参考状况的时候,开发者对线程创建一个控制,并能包住整个线程与try/catch语句.如果我仍然错过相关问题,涵盖此案例,我将非常感谢这个链接
在我的应用程序中,我整合了Crashlytics,ACRA和Google Analytics来报告崩溃事件
- >一个人对其他人有任何副作用吗?
- >哪一个更好用.
- >崩溃报告工具如何工作,如果遇到崩溃,其他人将如何报告相同的崩溃?
我有没有办法注册一个全局错误处理程序,以防止应用程序崩溃?此处描述了崩溃报告:如何从Android应用程序获取崩溃数据?.我有一个想法是扩展这些解决方案以接受应用程序上下文,以便可以重定向到特定的报告活动?但是一旦报告崩溃,不确定应用程序上下文是否在此时有效?
但是,当发生崩溃时,如何将用户重定向到全局错误消息Activity?是否有一些高级方法来注册错误处理程序,以捕获所有错误并防止崩溃?有没有办法注册这样的处理程序,以便它可以防止或幸免于崩溃,然后将用户重定向到一个特定的活动,这将显示有问题的错误消息?
这是我对错误处理程序的修改:
1)只需将applicationContext构造函数作为ctx 传递给构造函数
2)添加reportError(stackTrace)方法将控制转移到错误消息页面
private void reportError(String stackTrace){
Intent i = new Intent(ctx, DisplayErrorActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setAction("DISPLAY_ERROR_ACTIVITY");
Bundle b = new Bundle();
b.putString("STACKTRACE", stackTrace);
i.putExtras(b);
try{
Log.d("MyErrorHandler","reportError ctx="+ctx);
ctx.startActivity(i);
} catch (Exception e) {
Exception ex = e;
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
并reportError在下面打电话:
public void uncaughtException(Thread t, Throwable e) {
Log.d("MyUncoughtExceptionHandler", "uncoughtException ctx="+ctx);
String timestamp=getDateTime();
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
String stacktrace = result.toString(); …Run Code Online (Sandbox Code Playgroud) 我有一段代码在JSON字符串中编码某种业务数据:
public String encodeDataAsJsonString(Data data) throws JSONException {
JSONObject o = new JSONObject();
o.put("SomeField1", data.getSomeProperty1());
o.put("SomeField2", data.getSomeProperty2());
...
return o;
}
Run Code Online (Sandbox Code Playgroud)
事情是:
因此,我最终在调用方法中执行此操作:
...
try {
encoded = encodeDataAsJsonString(data);
} catch (JSONException e) {
throw new RuntimeException(e);
}
...
Run Code Online (Sandbox Code Playgroud)
这似乎是不幸中之大幸不是添加throws JSONException到每一个方法调用堆栈.但是,它仍然感觉很脏,因此我的问题是:
如果我想要一些特定的检查异常去"常规未经检查的异常路由",是否将它重新抛出为RuntimeException正确使用的习惯用法?