如标题,这个问题网上有很人遇到,场景是跨进程启动activity或service通传Intent传Parcel数据时遇到,网上总结是类加载器设置不对的原因。我遇到的问题场景是在当前进程中,启动新的activity解析传过来的Parcel子类时出现的异常,异常backtrace如下:
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.myapplication.UserBean
at android.os.Parcel.readParcelableCreator(Parcel.java:2554)
at android.os.Parcel.readParcelable(Parcel.java:2480)
at android.os.Parcel.readValue(Parcel.java:2383)
at android.os.Parcel.readMapInternal(Parcel.java:2733)
at android.os.Parcel.readHashMap(Parcel.java:1871)
at com.example.myapplication.TestBean.(TestBean.java:19)
at com.example.myapplication.TestBean$1.createFromParcel(TestBean.java:36)
at com.example.myapplication.TestBean$1.createFromParcel(TestBean.java:33)
at android.os.Parcel.readParcelable(Parcel.java:2489)
at android.os.Parcel.readValue(Parcel.java:2383)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2750)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.Bundle.getParcelable(Bundle.java:864)
at android.content.Intent.getParcelableExtra(Intent.java:6464)
at com.example.myapplication.TestActivity.onStart(TestActivity.java:25)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1249)
at android.app.Activity.performStart(Activity.java:6830)
顺藤摸瓜,使用when unmarshalling关键字去看下Parcel.java的源码
然后,设置一下断点,去看下loader是什么,以及什么时候传进入来的(tips:这里时候要用方法断点,源码行号断点是断不下的呀)
问题的代码是:
public class TestBean implements Parcelable {
private String tag;
private HashMap mHashMap;
public TestBean(String tag) {
this.tag = tag;
mHashMap = new HashMap<>();
}
protected TestBean(Parcel in) {
tag = in.readString();
mHashMap = in.readHashMap(HashMap.class.getClassLoader());//这里传入了Loader有问题!!!
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(tag);
dest.writeMap(mHashMap);
}
@Override
public int describeContents() {
return 0;
}
手动更改类加载器为PathClassLoader
mHashMap = in.readHashMap(HashMap.class.getClassLoader())
# 修改如下
mHashMap = in.readHashMap(TestBean.class.getClassLoader());
我们可以调试看下TestBean.clas.getClassLoader是什么Loader,如下图所示: