处理 Android 自定义内容提供程序中的(跨进程)异常

Posted

技术标签:

【中文标题】处理 Android 自定义内容提供程序中的(跨进程)异常【英文标题】:Dealing with (cross-process) exceptions in Android custom content provider 【发布时间】: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(似乎) 【参考方案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...

以上是关于处理 Android 自定义内容提供程序中的(跨进程)异常的主要内容,如果未能解决你的问题,请参考以下文章

Android面试四大组件之内容提供者ContentProvider

Android Studio TextView 文本选择处理程序图标位置

android中的跨进程是啥意思

Android跨进程通信

Carson带你学Android:全面剖析Binder跨进程通信原理

ContentProvider 和ContentResolver内容提供者和内容解析者