8

Bu hata, tekdüze, garip olan görünüyor. Genellikle iyi çalışır, ama bazen o kadar sürünür. BuradaBadParcelableException - BroadcastReceiver intent crash

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); 
} 

Ve istisna edilmektedir:

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 

hata getParcelableExtra hattında ortaya görünmektedir İşte BroadcastReceiver içindedir benim koddur. "MyMessage" sınıfı (açıkça benim kendi projemde farklı bir şey olarak adlandırılmıştır) gerçekten var; bir kütüphanede bulunur. Çoğu zaman çalışır, ancak yayını aldığım her seferinde bu çöküşü engelleyebileceğim zamanlar vardır.

Bunun farkına varmayacağımı anlıyorum, ancak alıcıda bunu yakalamak için farklı bir şey yapıp yapamayacağımı görmek istedim. Ya da Broadcast göndermenin yanında kesinlikle bir şey varsa, gerekirse buna odaklanabilirim. Ama ara sıra, bunun benim amacım için uygun şekilde kurulduğundan emin olmak istedim. Bu kilitlenme ile benzer başka gönderileri kontrol ettim, ancak BroadcastReceiver'daki amaçtan bu tür bir parcelable içeren bir şey bulamıyorum.

Bu konuyla ilgili herhangi bir rehberlik için şimdiden teşekkür ederiz!

DÜZENLEME İşte gerekirse MyMessage için yapıcı, neye benzediği:

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

cevap

8

unmarshalling sürecinde doğru ClassLoader ayarlayarak ben çözüldü gördüğüm bu konuda vakalarının çoğu Özel Parcelable sınıfınız.

özel olarak ClassLoader elde nasıl, senin MyMessage yapıcı daha yakından göz atın:

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()); 
} 

fazla detay in this question bulunabilir.


GÜNCELLEME: Ayrıca senin Intent içerdiği Bundle için doğru ClassLoader ayarlamayı deneyin:

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 mantıklı. Sorularımı, kurucunun MyMessage için neye benzediğini gerçekten içerdiğini güncelledim. Bu kod sadece "readString()" ve "readInt()" yöntemlerini kullanıyormuş gibi görünüyor. Eğer bunlar değişmeli mi? Bunu yapmakta ihtiyatlı davranacağım, çünkü bu MyMessage sınıfı uygulama çerçevemizin her yerinde farklı yerlerde kullanılıyor. Bu yüzden MyMessage sınıfına dokunmayı içermeyen bir çözüm var mı? Bu arada, unmarshalling süreci hakkında kendimi daha yakından tanımak için daha derin okuyacağım. – svguerin3

+0

@ svguerin3 Cevabımı güncelledim, lütfen bir göz atın. –

+0

Ne yazık ki, ClassLoader öğesinin ayarını Intent için onReceive değerine eklerken, kilitleme yine de aynı BadParcelableException ile gerçekleşiyor. :(Şimdi gerçekten çok şaşkınım.Nasıl olursa olsun bu konuda yardımın için minnettarım.herhangi bir şansı olan başka bir düşünce var mı? – svguerin3