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

12

我在我的Android应用程序中有一个自定义内容提供者,工作得相当不错。 我期望其他应用程序也访问我的内容提供者。 我想要一些干净的方式来传达异常和错误,但据我所知,Android内容提供程序框架没有提供在进程之间传播异常的方式。

我应该如何向我的调用者指示异常状态? 我是否必须将它某种方式编码到返回的数据中,并依赖于客户端进行检查? 是否有任何替代方案? 如果将其编码到普通返回数据中,则最佳方法是什么? (我可以看到在query调用返回的Cursor中有许多替代方案,但是对于由insert返回的Uri或由updatedelete返回的int呢?)


当您尝试从ContentProvider引发某种RuntimeException时,会发生什么? - CommonsWare
使用ContentProviderClient时,当提供程序抛出RuntimeException时,queryinsert都返回null。在logcat中,我可以看到一个带有标签JavaBinder的消息:*** Uncaught remote exception! (Exceptions are not yet supported across processes.) - Robert Tupelo-Schneck
当抛出任何异常时,更新返回0(似乎是这样) - arberg
1个回答

19

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

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

最近更新的Parcel.writeException文档增加了以下内容:

  • UnsupportedOperationException
  • NetworkOnMainThreadException

来源:创建内容提供者提到了IAENPE;我根据Parcel.writeException的 Javadoc猜测其他异常也可以起作用。

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

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


最终我使用了Android的org.json包将数据编码到IllegalStateException的详细信息中,并提供了一个API,供客户端使用反射转换为其他Exception类。 - Robert Tupelo-Schneck
没有人知道为什么ContentProvider只提到IAE和NPE?Parcel#writeException()文档来自API级别1... - JohnyTex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接