11

Ich habe einen benutzerdefinierten Inhaltsanbieter in meiner Android-App, der einigermaßen gut funktioniert. Ich erwarte, dass andere Apps auch auf meinen Inhaltsanbieter zugreifen. Ich möchte eine saubere Möglichkeit, Ausnahmen und Fehler zu kommunizieren, aber soweit ich das beurteilen kann, bietet das Android Content Provider Framework keine Möglichkeit, Ausnahmen über Prozesse hinweg zu verbreiten.Umgang mit (prozessübergreifenden) Ausnahmen im benutzerdefinierten Android-Inhaltsanbieter

Wie soll ich meinem Anrufer einen Ausnahmezustand anzeigen? Muss ich es irgendwie in meine zurückgesendeten Daten kodieren und mich darauf verlassen, dass die Kunden danach suchen? Gibt es eine Alternative? Wenn es in die gewöhnlichen Rückgabedaten kodiert ist, was ist der beste Weg? (Kann ich eine Reihe von Alternativen für die Cursor sehen von einem query Aufruf zurückgegeben, aber was ist mit dem Uri von insert zurückgegeben oder die int zurück von update oder delete?)

+0

Wenn Sie versucht haben, irgendeine Art von 'RuntimeException' aus Ihrem' ContentProvider' auszulösen, was ist passiert? – CommonsWare

+0

Mit 'ContentProviderClient' geben' query' und 'insert' beide' null' zurück, wenn der Provider eine 'RuntimeException' auslöst. Im Logcat kann ich eine Nachricht mit dem Tag 'JavaBinder' sehen:' *** Uncaught remote exception! (Ausnahmen werden noch nicht prozeßübergreifend unterstützt.) ' –

Antwort

14

Es ist eine kurze Liste von RuntimeException Unterklassen, die, Wenn es in den Provider geworfen wird, wird in einer Client-App neu geworfen. Diese sind:

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

Quelle: Creating Content ProvidersIAE und NPE erwähnt; Ich vermutete, dass die anderen basierend auf the Javadoc forParcel.writeException arbeiten würden.

Die Client-App erhält nur die Detailnachricht, nicht eine Stack-Ablaufverfolgung oder den Cause-Stack. Für einen Ausnahmezustand, der in eine String (die Detailnachricht) codiert werden kann, ist dies eine vernünftige Wahl.

Ich bin immer noch an anderen Lösungen interessiert.

+0

Ich benutzte das Android [org.json-Paket] (http://developer.android.com/reference/org/json/package-summary.html), um Daten in zu codieren die Detailnachricht einer 'IllegalStateException' und eine API für Clients bereitstellen, die Reflektionen in andere 'Exception'-Klassen zu übersetzen. –