8

이 오류는 산발적으로 발생하는 것으로 보입니다. 이는 이상합니다. 대개 정상적으로 작동하지만 때로는 오싹 해집니다. 여기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 라인에서 발생하는 것 같습니다 여기에 브로드 캐스트 리시버에 내 코드입니다. "MyMessage"클래스 (내 프로젝트에서 다른 이름이 분명히 있음)는 실제로 존재합니다. 그것은 도서관에 들어 있습니다. 대부분의 경우 작동하지만, 브로드 캐스트가 수신 될 때마다 충돌이 발생할 수있는 경우가 있습니다.

나는 이것이별로 멀지 않다는 것을 알고 있지만, 나는 그것을 잡기 위해 수신기에서 다르게 할 수있는 것이 있는지 알아보기를 원한다. 그래서 충돌을 일으키지 않는다. 브로드 캐스트를 전송하는 측에서 분명히 뭔가가있는 경우 필요한 경우에만 집중할 수 있습니다. 그러나 잠시 동안, 나는 이것이 내 목적에 맞게 올바르게 설정되었는지 확인하기를 원했습니다. 이 충돌로 다른 유사한 게시물을 확인했지만, BroadcastReceiver의 의도에서이 특정한 유형의 소급 성을 포함하는 것을 찾을 수없는 것 같습니다.

미리 감사드립니다.

편집 여기 필요한 경우 MyMessage의 생성자는 모습입니다 :

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

답변

8

비 정렬 화의 과정에서 올바른 ClassLoader을 설정하여 내가 해결했다 보았다이 문제의 경우 대부분 귀하의 맞춤 Parcelable 수업.

은 특히 당신이 ClassLoader를 얻는 방법에 대한 귀하의 MyMessage 생성자에 대해 자세히 살펴 유무 :

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를 찾을 수 있습니다.


UPDATE :은 또한 당신의 Intent에 포함 Bundle에 대한 올바른 ClassLoader을 설정하려고 :

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 클래스는 응용 프로그램 프레임 워크의 여러 곳에서 사용되므로주의해야합니다. 그래서 MyMessage 클래스를 만지는 것을 포함하지 않는 솔루션이 필요합니까? 그 동안 언 마샬링 프로세스에 대해 더 잘 이해하기 위해 더 깊은 내용을 읽도록하겠습니다. – svguerin3

+0

@ svguerin3 내 대답을 업데이트했습니다.보세요. –

+0

불행히도 의도에 대한 onReceive에서 ClassLoader 설정을 추가하는 동안에도 충돌은 여전히 ​​동일한 BadParcelableException으로 발생합니다. :(이제 나는 정말 곤란하다.)이 문제에 관계없이 도움을 주셔서 감사합니다. 다른 생각은 언제든 가능합니까? – svguerin3