【问题标题】:Dealing with (cross-process) exceptions in Android custom content provider处理 Android 自定义内容提供程序中的(跨进程)异常
【发布时间】:2012-08-12 04:18:44
【问题描述】:

我的 Android 应用中有一个自定义内容提供程序,运行良好。我希望其他应用程序也可以访问我的内容提供商。我想要一些干净的方式来传达异常和错误,但据我所知,Android 内容提供程序框架没有提供任何跨进程传播异常的方式。

我应该如何向调用者指示异常状态?我是否必须以某种方式将其编码到我返回的数据中并依靠客户来检查它?有没有其他选择?如果编码成普通的返回数据,最好的方法是什么? (我可以看到query 调用返回的Cursor 的许多替代方案,但是insert 返回的Uriupdatedelete 返回的int 呢?)

【问题讨论】:

  • 当您尝试从您的ContentProvider 提出某种RuntimeException 时,发生了什么?
  • 使用 ContentProviderClientqueryinsert 在提供者抛出 RuntimeException 时都返回 null。在 logcat 中,我可以看到带有标签 JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 的消息
  • 当抛出任何异常时更新返回 0(似乎)

标签: android exception-handling error-handling android-contentprovider


【解决方案1】:

有一个简短的RuntimeException 子类列表,如果在提供程序中抛出,将在客户端应用程序中重新抛出。其中包括:

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

添加了对 Parcel.writeException 文档的更新

  • UnsupportedOperationException
  • NetworkOnMainThreadException

来源:Creating Content Providers 提及IAENPE;我猜其他人会根据the Javadoc for Parcel.writeException工作。

客户端应用程序只会获取详细消息,而不是堆栈跟踪或原因堆栈。对于可以编码为String(详细消息)的异常状态,这是一个合理的选择。

我仍然对其他解决方案感兴趣。

【讨论】:

  • 我最终使用 Android 的 org.json package 将数据编码为 IllegalStateException 的详细消息,并为客户端提供 API 以使用反射将其转换为其他 Exception 类。
  • 没有人知道为什么 ContentProvider 只提到 IAE 和 NPE? Parcel#writeException() 文档来自 API 级别 1...
猜你喜欢
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2015-10-18
  • 2023-03-04
  • 2020-01-23
  • 2011-10-10
相关资源
最近更新 更多