이 오류는 산발적으로 발생하는 것으로 보입니다. 이는 이상합니다. 대개 정상적으로 작동하지만 때로는 오싹 해집니다. 여기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();
}
아 의미가 있습니다. MyMessage에 대한 생성자의 모양을 실제로 포함하도록 내 질문을 업데이트했습니다. 이 코드가 표준 "readString()"및 "readInt()"메소드를 사용하는 것처럼 보입니다. 그것들이 변경되어야하는지 궁금합니까? 이 MyMessage 클래스는 응용 프로그램 프레임 워크의 여러 곳에서 사용되므로주의해야합니다. 그래서 MyMessage 클래스를 만지는 것을 포함하지 않는 솔루션이 필요합니까? 그 동안 언 마샬링 프로세스에 대해 더 잘 이해하기 위해 더 깊은 내용을 읽도록하겠습니다. – svguerin3
@ svguerin3 내 대답을 업데이트했습니다.보세요. –
불행히도 의도에 대한 onReceive에서 ClassLoader 설정을 추가하는 동안에도 충돌은 여전히 동일한 BadParcelableException으로 발생합니다. :(이제 나는 정말 곤란하다.)이 문제에 관계없이 도움을 주셔서 감사합니다. 다른 생각은 언제든 가능합니까? – svguerin3