我正在为 Acra (https://github.com/ACRA/acra/wiki/AdvancedUsage#implementing-your-own-sender) 设计一个自定义发送器,我正在尝试确定 ACRA 在没有可用网络时的行为方式。正如我从这个问题(https://code.google.com/p/acra/issues/detail?id=11)中了解到的那样,如果没有互联网连接,ACRA将存储一个待处理的报告,并在下次调用ACRA.init()时将其发送出去(大概是下一个应用程序启动)。我的问题是这适用于我的自定义发件人吗?
ACRA.init(this);
ACRA.getErrorReporter().setReportSender(new MyCustomSender());
这是 ACRA 指南中描述的一般代码结构,但在查看问题 11 中的代码和描述时,我相信这不会使用我的自定义发送器,因为它仅在调用 ACRA.init() 后设置,对吧?我是否缺少另一种机制可以正确处理此问题,以便仅使用我的自定义发件人而不是默认发件人发送待处理的报告?
我确实意识到我这个答案有点晚了。然而,这就是我最终进行一些搜索的地方。
您可以通过以下初始化使用自定义发件人发送待处理报告:
private void initACRA () {
final ReportsCrashes rc = this.getClass()
.getAnnotation(ReportsCrashes.class);
if (rc == null) {
return;
}
ACRA.init(this, new ACRAConfiguration(rc), false);
ErrorReporter reporter = ACRA.getErrorReporter();
reporter.setReportSender(new MyCustomSender());
reporter.checkReportsOnApplicationStart();
}
只需确保在没有网络连接/发送失败的情况下在自定义发送器中抛出ReportSenderException
。如果报告未发送且报告文件 ( *-approved.stacktrace
) 仍然消失,请确保捕获任何RuntimeException
并抛出ReportSenderException
。RuntimeException
和ReportSenderException
都会导致ACRA的相同日志输出,这不是最方便的解决方案。
看起来你是对的。
现在值得重新审视ACRA配置,因为GoogleDocs不再是一个有效的目标。更适合注入自定义发件人的东西。
修改 ACRA 以执行您想要的操作应该太难了。可能是对 ErrorReport#setDefaultReportSenders 的一个小改动。我相信拉取请求将被感激地接受。