2010-02-21 21 views
10

Utilizo un Parcelable personalizado para transportar algunos datos a un BroadcastReceiver. Esto es lo que hago:ClassNotFoundException al usar personalizado Parcelable

Registre mi intento y establezca el Parcelable adicional en él junto con un cargador de clases adicional (intent.setExtraClassLoader (..)). A continuación, programo la ejecución de la transmisión a través de un AlarmManager.

Así que cuando el AlarmManager se dispara, mira mi intención con su paquete que no puede procesar, ya que no usa el cargador de clases suministrado (tal como lo cose).

Creo que el cargador de clases se pierde cuando Inten.fillIn copie el intento a uno nuevo (ver el seguimiento de la pila).

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) 

¿Hay alguna forma de evitar ese problema? Cualquier ayuda sería apreciada.

Gracias

Respuesta

7

Pon com.company.project.MyParcelable en la aplicación real, en lugar de hacer lo que los juegos que están jugando con los cargadores de clases. Luego, debe estar disponible desde el remitente y el destinatario del Intent.

+0

El AlarmManager está programada cuando se recibe una acción BOOT_COMPLETED. Entonces no comienzo la intención en mi aplicación. ¿Hay una mejor manera de manejar la situación? – Moritz

+4

¡Oh! Ya veo. No lo noté en el seguimiento de la pila. Fuera del manguito, parece que no puedes usar un 'Parcelable' personalizado con un' PendingIntent', que apesta un poco. En lugar de usar 'Parcelable', es posible que deba serializar su objeto de otra forma (por ejemplo, a' Bundle', a 'String'). – CommonsWare

+0

Sí, canalizar los datos a través de un objeto adicional es una forma de hacerlo. Aunque lo más extraño es que obtengo la excepción mencionada, pero mi objeto de datos se transfiere en realidad. Entonces funciona, pero derrama la excepción todo el tiempo, lo cual es confuso y amenazante. – Moritz

6

Parece que se enfrenta con el problema descrito aquí: https://code.google.com/p/android/issues/detail?id=6822

No es una solución descrita en uno de los comentarios en virtud de dicho enlace: poner su costumbre Parcelable en un adicional Bundle. Debido a que las partes internas de Bundle no se tocan hasta que se necesiten, se puede enviar un Intent a su aplicación, ya que nadie intentará desmantelar su clase fuera de su aplicación.

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

¿Hay una 'regla' para el paquete de claves y la intención de la clave es diferente? – andresmafra

+0

no, no es obligatorio. –

+0

Para mí no funcionó. Probé todos los comentarios aquí y en el tema de discusión de 6822 temas de Android. ¿Hay otro WA? – andresmafra

Cuestiones relacionadas