8

यह त्रुटि sporadically होने लगता है, जो विषम है। यह आमतौर पर ठीक काम करता है, लेकिन कभी-कभी यह रेंगता है।BadParcelableException - BroadcastReceiver इरादा क्रैश

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

और यहाँ अपवाद है::

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 

त्रुटि getParcelableExtra लाइन पर होने लगता है यहाँ मेरी कोड है, जो एक BroadcastReceiver में है। "माईमेसेज" वर्ग (स्पष्ट रूप से मेरे स्वयं के प्रोजेक्ट में कुछ अलग नाम दिया गया है) वास्तव में मौजूद है; यह एक पुस्तकालय में निहित है। यह ज्यादातर समय काम करता है, लेकिन ऐसे समय होते हैं जब प्रसारण प्राप्त होने पर हर बार क्रैश हो सकता है।

मुझे एहसास है कि इसे छोड़ने के लिए बहुत कुछ नहीं है, लेकिन मैं सिर्फ यह देखना चाहता था कि रिसीवर में ऐसा कुछ करने के लिए मैं कुछ भी कर सकता हूं ताकि यह क्रैश न हो। या यदि ब्रॉडकास्ट भेजने के पक्ष में यह निश्चित रूप से कुछ है, तो यदि आवश्यक हो तो मैं उस पर ध्यान केंद्रित कर सकता हूं। लेकिन अंतरिम में, मैं बस यह सुनिश्चित करना चाहता था कि यह मेरे उद्देश्यों के लिए उचित रूप से सेटअप हो। मैंने इस दुर्घटना के साथ अन्य समान पदों की जांच की है, लेकिन मुझे ऐसा कोई प्रतीत नहीं होता है जिसमें ब्रॉडकास्ट रिसीवर में इस विशिष्ट प्रकार के पार्सलबल को शामिल किया जा सके।

इस पर किसी भी मार्गदर्शन के लिए अग्रिम धन्यवाद!

संपादित यहाँ MyMessage के लिए निर्माता, कैसा दिखता है अगर जरूरत है:

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

उत्तर

8

इस मुद्दे के मामलों unmarshalling की प्रक्रिया में सही ClassLoader की स्थापना करके मैंने देखा है हल किया गया के अधिकांश आपकी कस्टम Parcelable कक्षा।

, अपने MyMessage निर्माता को करीब से देख लो विशेष रूप से कैसे आप 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()); 
} 

अधिक जानकारी in this question पाया जा सकता है।


अद्यतन: इसके अलावा, Bundle के लिए सही ClassLoader अपने Intent में निहित सेट करने का प्रयास:

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

आह कि समझ में आता है। मैंने वास्तव में यह प्रश्न रखने के लिए अपना प्रश्न अपडेट किया कि कन्स्ट्रक्टर MyMessage के लिए कैसा दिखता है। ऐसा लगता है कि यह कोड केवल मानक "readString()" और "readInt()" विधियों का उपयोग कर रहा है। उत्सुक अगर उन्हें बदला जाना चाहिए? मैं ऐसा करने के लिए सावधान रहूंगा, क्योंकि इस माईमेज क्लास का उपयोग हमारे विभिन्न आवेदन ढांचे में कई अलग-अलग स्थानों में किया जाता है। तो मुझे उम्मीद है कि एक समाधान है जिसमें MyMessage क्लास को छूना शामिल नहीं है? मैं अनमोल प्रक्रिया के बारे में खुद को परिचित करने के लिए इस दौरान गहराई से पढ़ूंगा। – svguerin3

+0

@ svguerin3 मैं अपने जवाब को अपडेट किया है, तो कृपया एक नजर है। –

+0

आशय के लिए onReceive में classloader की स्थापना जोड़ने दुर्भाग्य से यहाँ तक कि जब, दुर्घटना अभी भी वही BadParcelableException साथ होता है। :(अब मैं कर रहा हूँ सच में स्टम्प्ड। मैं आपकी मदद के इस के साथ परवाह किए बिना, किसी भी संयोग से सराहना करते हैं। किसी भी अन्य विचार? – svguerin3