11

Nella mia app per Android è disponibile un fornitore di contenuti personalizzato che funziona ragionevolmente bene. Prevedo che altre app possano accedere anche al mio fornitore di contenuti. Vorrei un modo pulito per comunicare eccezioni ed errori, ma per quanto posso dire il framework del content provider Android non fornisce alcun modo per propagare le eccezioni tra i processi.Gestione delle eccezioni (cross-process) nel fornitore di contenuto personalizzato Android

Come dovrei indicare uno stato di eccezione al mio chiamante? Devo in qualche modo codificarlo nei miei dati restituiti e contare sui client per verificarlo? C'è qualche alternativa? Se la codifica nei dati di ritorno ordinari è, qual è il modo migliore? (Posso vedere una serie di alternative per la Cursor restituito da una chiamata query, ma per quanto riguarda la Uri restituito da insert, o il int restituito da update o delete?)

+0

Quando si è tentato di generare una sorta di 'RuntimeException' dal proprio ContentProvider, cosa è successo? – CommonsWare

+0

Utilizzando 'ContentProviderClient',' query' e 'insert' restituiscono' null' quando il provider lancia una 'RuntimeException'. Nel logcat posso vedere un messaggio con tag 'JavaBinder':' *** Eccezione remota non rilevata! (Le eccezioni non sono ancora supportate tra i processi.) ' –

risposta

14

C'è un breve elenco di RuntimeException sottoclassi che, se viene lanciato nel provider, verrà nuovamente lanciato in un'app client. Questi sono:

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

Fonte: Creating Content Providers menziona IAE e NPE; Ho immaginato che gli altri avrebbero funzionato sulla base di the Javadoc forParcel.writeException.

L'app client riceverà solo il messaggio di dettaglio, non una traccia di stack o lo stack di cause. Per uno stato eccezionale che può essere codificato in un String (il messaggio di dettaglio), questa è una scelta ragionevole.

Sono ancora interessato anche ad altre soluzioni.

+0

Ho finito per utilizzare il pacchetto [org.json] di Android (http://developer.android.com/reference/org/json/package-summary.html) per codificare i dati in il messaggio di dettaglio di un 'IllegalStateException', e fornisce un'API per i client per tradurre usando la riflessione in altre classi 'Exception'. –