通过Intent在Activity间传递对象时遇‘New hash 0...’错误求助
嘿,我之前也碰到过这个诡异的Parcelable哈希错误,咱们来一步步排查解决!
你现在的场景是用Intent在Activity1和Activity2之间传递mission和task两个Parcelable对象,但遇到了这个错误日志:
New hash 0 is before end of array hash 3552645 at index 1 key null
先看你贴的代码,传递和获取的逻辑本身没问题,问题大概率出在Parcelable接口的实现细节上,下面是几个最可能的解决方向:
检查Parcelable读写的字段顺序和类型是否完全一致
这是最常见的原因!在自定义的Mission和Task类里,writeToParcel方法写入字段的顺序,必须和createFromParcel(或构造函数)里读取字段的顺序、类型完全对应,哪怕差一个都不行。举个正确的例子:public class Mission implements Parcelable { private String missionName; private int missionId; // 构造函数、describeContents方法等省略... @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(missionName); // 先写字符串 dest.writeInt(missionId); // 再写整数 } protected Mission(Parcel in) { missionName = in.readString(); // 先读字符串,顺序和写入一致 missionId = in.readInt(); // 再读整数 } public static final Creator<Mission> CREATOR = new Creator<Mission>() { @Override public Mission createFromParcel(Parcel in) { return new Mission(in); } @Override public Mission[] newArray(int size) { return new Mission[size]; } }; }一定要保证写入和读取的每一步完全对应,新增字段时也要同步更新两边的代码。
检查嵌套对象的Parcelable实现
如果mission或task里包含其他自定义对象(比如一个SubTask类),那这个嵌套对象也必须正确实现Parcelable接口。写入时要调用dest.writeParcelable(subTask, flags),读取时用in.readParcelable(SubTask.class.getClassLoader()),不能遗漏任何嵌套对象的处理。处理null字段的情况
虽然Parcelable本身支持null,但如果是自定义嵌套对象,最好在写入时显式判断null,避免解析异常:// 写入时 if (subTask != null) { dest.writeInt(1); dest.writeParcelable(subTask, flags); } else { dest.writeInt(0); } // 读取时 int hasSubTask = in.readInt(); if (hasSubTask == 1) { subTask = in.readParcelable(SubTask.class.getClassLoader()); } else { subTask = null; }清理并重新构建项目
有时候Android Studio的增量构建缓存会出问题,导致Parcelable的代码解析异常。试试点击菜单栏的Build > Clean Project,然后Build > Rebuild Project,说不定就能解决这个奇怪的哈希错误。
一般来说,先排查第一点的读写顺序问题,这个解决后大部分情况都能搞定!
内容的提问来源于stack exchange,提问作者M.FD

