8

Dieser Fehler scheint sporadisch zu geschehen, was merkwürdig ist. Es funktioniert normalerweise gut, aber manchmal schleicht es sich nach oben. Hier ist mein Code, der in einem BroadcastReceiver ist:BadParcelableException - Absturz des BroadcastReceivers absichtlich

public void onReceive(Context context, Intent intent) { 
    MyCustomResponseMsg message = new MyCustomResponseMsg((MyMessage) intent.getParcelableExtra(MyMessage.EXTRA_MESSAGE_KEY)); 

    // do stuff with the message 

    setResultCode(Activity.RESULT_OK); 
} 

Und hier ist die Ausnahme:

01-16 10:05:03.834: ERROR/AndroidRuntime(13533): FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start receiver com.(path-to-broadcast-receiver).MyReqReceiver: 
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.(path-to-my-message).MyMessage 
at android.app.ActivityThread.handleReceiver(ActivityThread.java:1805) 
at android.app.ActivityThread.access$2400(ActivityThread.java:117) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3683) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:  com.(path-to-my-message).MyMessage 
at android.os.Parcel.readParcelable(Parcel.java:1958) 
at android.os.Parcel.readValue(Parcel.java:1846) 
at android.os.Parcel.readMapInternal(Parcel.java:2083) 
at android.os.Bundle.unparcel(Bundle.java:208) 
at android.os.Bundle.getParcelable(Bundle.java:1100) 
at android.content.Intent.getParcelableExtra(Intent.java:3437) 
at  com.(path).MyReceiver.onReceive(My ReqReceiver.java:23) 
at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794) 
... 10 more 

Der Fehler scheint auf der getParcelableExtra Linie auftreten. Die "MyMessage" -Klasse (in meinem eigenen Projekt natürlich etwas anderes genannt) existiert tatsächlich; Es ist in einer Bibliothek enthalten. Es funktioniert die meiste Zeit, aber es gibt Zeiten, in denen ich jedes Mal zum Absturz kommen kann, wenn die Sendung empfangen wird.

Ich weiß, das ist nicht viel los, aber ich wollte nur sehen, ob es etwas gibt, was ich anders im Empfänger tun könnte, um das zu erfassen, so dass es keinen Absturz verursacht. Oder wenn es definitiv etwas auf der Seite des Sendens der Sendung ist, dann kann ich mich bei Bedarf darauf konzentrieren. Aber in der Zwischenzeit wollte ich nur sicherstellen, dass dies für meine Zwecke richtig eingerichtet wurde. Ich habe andere ähnliche Posts mit diesem Absturz überprüft, aber ich kann anscheinend keine finden, die diese spezifische Art von Parcelable betreffen, die von der Absicht in einem BroadcastReceiver kommen.

Vielen Dank im Voraus für jede Anleitung zu diesem Thema!

EDIT Hier ist, was der Konstruktor für MyMessage aussieht, wenn nötig:

public MyMessage(Parcel in) { 
    field1 = in.readInt(); 
    field2 = in.readString(); 
    field3 = in.readString(); 
} 

Antwort

8

I Die meisten Fälle dieses Problems haben, indem Sie die richtigen ClassLoader in Prozess der unmarshalling wurden aufgelöst gesehen Ihre benutzerdefinierte Parcelable Klasse.

Haben Sie einen genaueren Blick auf Ihre MyMessage Konstruktor, speziell, wie Sie erhalten ClassLoader:

private MyMessage(Parcel in) { 
    //... 
    //causes ClassNotFoundException 
    this.field=in.readParcelable(null); 
    //causes ClassNotFoundException, in fact it's equivalent to previous 
    this.field=in.readParcelable(ClassLoader.getSystemClassLoader()); 

    //this one should work 
    this.field=in.readParcelable(getClass().getClassLoader()); 
} 

Weitere Details in this question gefunden werden kann.


UPDATE: Versuchen Sie auch, richtig ClassLoader für Bundle in Ihrem Intent enthaltenen Einstellung:

public void onReceive(Context context, Intent intent) { 
    Bundle extras=intent.getExtras(); 
    extras.setClassLoader(getClass().getClassLoader()); 
    MyCustomResponseMsg message = new MyCustomResponseMsg((MyMessage) extras.getParcelable(MyMessage.EXTRA_MESSAGE_KEY)); 
    //... 
} 
+0

Ah, die Sinn macht. Ich habe meine Frage so aktualisiert, dass sie tatsächlich enthält, wie der Konstruktor für MyMessage aussieht. Es scheint, als ob dieser Code nur die Standardmethoden "readString()" und "readInt()" verwendet. Neugierig, wenn diese geändert werden sollten? Ich wäre vorsichtig, da diese MyMessage-Klasse an vielen verschiedenen Stellen in unserem Anwendungsframework verwendet wird. Ich hoffe also, dass es eine Lösung gibt, bei der die MyMessage-Klasse nicht berührt wird? Ich werde in der Zwischenzeit tiefer lesen, um mich näher mit dem Prozess zu befassen. – svguerin3

+0

@ svguerin3 Ich aktualisierte meine Antwort, bitte schauen Sie. –

+0

Leider tritt der Absturz trotz des Hinzufügens der Einstellung des ClassLoaders in onReceive für die Absicht immer noch mit derselben BadParcelableException auf. :(Jetzt bin ich wirklich ratlos. Ich schätze Ihre Hilfe mit diesem unabhängig. Irgendwelche anderen Gedanken, durch Zufall? – svguerin3