2010-02-21 29 views
10

Uso un oggetto Parcelable per trasportare alcuni dati su un BroadcastReceiver. Ecco cosa devo fare:ClassNotFoundException quando si utilizza la funzione Parcelable personalizzata

Registrazione il mio intento e l'impostazione Parcelable extra su di esso insieme a un ulteriore programma di caricamento classi (intent.setExtraClassLoader (..)). Quindi pianifico l'esecuzione della trasmissione tramite un AlarmManager.

Così, quando AlarmManager si accende, guarda al mio intento con il suo pacco che non può elaborare poiché non usa il classloader fornito (come giunzioni).

Penso che il classloader si perda quando Inten.fillIn copia l'intento su uno nuovo (vedi stack trace).

02-21 21:09:25.214: WARN/Intent(52): android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.project.MyParcelable 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Parcel.readParcelable(Parcel.java:1822) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Parcel.readValue(Parcel.java:1713) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Parcel.readMapInternal(Parcel.java:1947) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Bundle.unparcel(Bundle.java:169) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Bundle.putAll(Bundle.java:242) 
02-21 21:09:25.214: WARN/Intent(52):  at android.content.Intent.fillIn(Intent.java:4530) 
02-21 21:09:25.214: WARN/Intent(52):  at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:185) 
02-21 21:09:25.214: WARN/Intent(52):  at android.app.PendingIntent.send(PendingIntent.java:400) 
02-21 21:09:25.214: WARN/Intent(52):  at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:636) 

Quindi c'è un modo per aggirare questo problema? Qualsiasi aiuto sarebbe apprezzato.

Grazie

risposta

7

Mettere com.company.project.MyParcelable nella effettiva applicazione, invece di fare qualunque giochi che stai giocando con classloader. Quindi, dovrebbe essere disponibile sia dal mittente che dal destinatario di Intent.

+0

L'AlarmManager è prevista quando si riceve un'azione BOOT_COMPLETED. Quindi non inizio l'intento nella mia domanda. C'è un modo migliore per gestire la situazione? – Moritz

+4

Oh! Io vedo. Non l'ho notato nella traccia dello stack. Esaurito, sembrerebbe che non si possa usare un oggetto 'Parcelable' con un' PendingIntent', il che puzza. Piuttosto che usare 'Parcelable', potresti aver bisogno di serializzare il tuo oggetto in un altro modo (ad es. In un' Bundle', in un 'String'). – CommonsWare

+0

Sì, il piping dei dati attraverso un oggetto pronto extra è un modo per andare. La cosa strana è che ottengo l'eccezione citata, ma il mio oggetto dati è effettivamente trasferito. Quindi funziona, ma riversa sempre l'eccezione che è confusa e minacciosa. – Moritz

6

sembra che si faccia con il problema descritto qui: https://code.google.com/p/android/issues/detail?id=6822

c'è una soluzione descritta in uno dei commenti sotto quel link: mettere la vostra abitudine Parcelable in un ulteriore Bundle. Dato che gli interni di Bundle non vengono toccati fino a quando non è necessario, tale Intent può essere consegnato alla tua app, dal momento che nessuno cercherà di rendere la tua classe unmarshal al di fuori della tua app.

Bundle hackBundle = new Bundle(); 
    hackBundle.put("key", myParcelable); 
    intent.putExtra("bundleKey", hackBundle); 
+0

C'è una "regola" per il pacchetto di chiavi e l'intento di chiave è diverso? – andresmafra

+0

no, non è obbligatorio –

+0

Per me non ha funzionato.Ho provato ogni commento qui e nella discussione sul thread dell'edizione di Android 6822. C'è un altro WA? – andresmafra

Problemi correlati