11

Androidアプリにカスタムコンテンツプロバイダがあり、うまく動作します。私は他のアプリも私のコンテンツプロバイダにアクセスすることを期待しています。私は例外やエラーを伝えるいくつかのきれいな方法を望みますが、Androidコンテンツプロバイダのフレームワークがプロセス間で例外を伝播する方法を提供していないと言える限り、Androidカスタムコンテンツプロバイダで(クロスプロセス)例外を処理する

発信者に例外状態をどのように示す必要がありますか?返されたデータに何とかエンコードして、クライアントがそれを確認する必要がありますか?何か別の選択肢はありますか?通常のリターンデータにエンコードするのが最適なのは何ですか? 、RuntimeExceptionサブクラスたの短いリストがあり

+0

'ContentProvider'から何らかの' RuntimeException'を呼び出そうとしたとき、どうしたのですか? – CommonsWare

+0

'ContentProviderClient'、' query'、 'insert'を使うと、プロバイダが' RuntimeException'を投げるときに 'null'を返します。 logcatでは、 'JavaBinder'というタグを持つメッセージを見ることができます:' ***未知のリモート例外! (例外はプロセス間ではまだサポートされていません) ' –

答えて

14

(私が?insertによって返さUri、またはupdateまたはdeleteによって返さint程度query呼び出しによって返さCursorのための選択肢の数が、何を見ることができます)プロバイダーにスローされた場合、クライアントアプリケーションで再スローされます。これらは次のとおりである:

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

出典:IAENPEを言及Creating Content Providers。私は他の人がthe Javadoc forParcel.writeExceptionに基づいて動作するだろうと推測しました。

クライアントアプリケーションは、スタックトレースまたは原因スタックではなく、詳細メッセージのみを取得します。 String(詳細メッセージ)にエンコードできる例外状態の場合、これは妥当な選択です。

私はまだ他のソリューションにも興味があります。

+0

Androidの[org.jsonパッケージ](http://developer.android.com/reference/org/json/package-summary.html)を使用してデータをエンコードしました'IllegalStateException'の詳細メッセージ、そしてリフレクションを使って他の' Exception'クラスに翻訳するためのAPIをクライアントに提供します。 –