如果我的应用程序崩溃,它会挂起几秒钟,然后 Android 告诉我该应用程序崩溃并需要关闭。所以我正在考虑用一般的方法捕获我的应用程序中的所有异常:
try {
// ...
} catch(Exception e) {
// ...
}
并制作一个新的Activity
这解释了应用程序立即崩溃(并且还让用户有机会发送包含错误详细信息的邮件),而不是由于 Android 而出现延迟。有更好的方法来实现这一点还是不鼓励这样做?
Update:我使用的是启用了 ART 的 Nexus 5,我没有注意到应用程序崩溃时遇到的延迟(我最初所说的“挂起”)。我认为,由于现在一切都是本机代码,因此崩溃会在获取所有崩溃信息的同时立即发生。也许 Nexus 5 只是速度很快:) 不管怎样,在 Android 的未来版本中这可能不是一个问题(考虑到 ART 将成为 Android L 中的默认运行时)。
在这里,检查链接供参考 http://trivedihardik.wordpress.com/2011/08/20/how-to-avoid-force-close-error-in-android/.
在这里你创建一个类说异常处理器 that implements java.lang.Thread.UncaughtExceptionHandler
..
在这个课程中,您将做一些挽救生命的事情,例如创建堆栈跟踪并准备好上传错误报告等......
现在到了重要的部分即如何捕获该异常。
虽然很简单。在重写中调用 super 方法后,在每个 Activity 中复制以下代码行onCreate
method.
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
您的活动可能看起来像这样......
public class ForceClose extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
setContentView(R.layout.main);
}
}
这是一个示例 ExceptionHandler 类:
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "ExceptionHandler";
@Override
public void uncaughtException(@NonNull Thread thread, @NonNull Throwable exception) {
Log.e(TAG, "uncaughtException: " + "\n" + getErrorReport(exception));
Log.i(TAG, getDeviceInfo());
Log.i(TAG, getFirmwareInfo());
stopTheApp();
}
private String getErrorReport(@NonNull Throwable exception) {
ApplicationErrorReport.CrashInfo crashInfo = new ApplicationErrorReport.CrashInfo(exception);
return "\nCAUSE OF ERROR\n" +
crashInfo.stackTrace;
}
private String getDeviceInfo() {
return
"\nDEVICE INFORMATION\n" +
"Brand: " +
Build.BRAND +
"\n" +
"Device: " +
Build.DEVICE +
"\n" +
"Model: " +
Build.MODEL +
"\n" +
"Id: " +
Build.ID +
"\n" +
"Product: " +
Build.PRODUCT +
"\n";
}
private String getFirmwareInfo() {
return "\nFIRMWARE\n" +
"SDK: " +
Build.VERSION.SDK_INT +
"\n" +
"Release: " +
Build.VERSION.RELEASE +
"\n" +
"Incremental: " +
Build.VERSION.INCREMENTAL +
"\n";
}
private void stopTheApp() {
android.os.Process.killProcess(android.os.Process.myPid());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)