Parcelable 嵌套 class 与地图 属性 使应用程序崩溃
Parcelable nested class with map property crashes app
我有两个可打包的类:
class MyDevice implements Parcelable{
@SerializedName("DeviceName")
public String DeviceName;
@SerializedName("StolenFlag")
public Boolean StolenFlag;
@SerializedName("BatteryLevel")
public int BatteryLevel;
@SerializedName("LastLocalization")
public Map<String,Geography> LastLocalization;
protected MyDevice(Parcel in) {
DeviceName = in.readString();
BatteryLevel = in.readInt();
StolenFlag = in.readByte() !=0;
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
}
....
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(DeviceName);
dest.writeByte((byte) (StolenFlag ? 1 : 0));
dest.writeInt(BatteryLevel);
dest.writeParcelable(LastLocalization.get("Geography"), 0);
}
}
第二个:
class Geography implements Parcelable{
@SerializedName("CoordinateSystemId")
public int CoordinateSystemId;
@SerializedName("WellKnownText")
public String WellKnownText;
protected Geography(Parcel in) {
CoordinateSystemId = in.readInt();
WellKnownText = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(CoordinateSystemId);
dest.writeString(WellKnownText);
}
}
把它付诸实践就可以了。当我试图从意图中得到它时:
Intent intent = getIntent();
ArrayList<MyDevice> MyDevicesList = intent.getParcelableArrayListExtra("data");
我的应用程序崩溃并给出错误:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.andrev.lab3/com.example.andrev.lab3.SecondActivity}: java.lang.ClassCastException: com.example.andrev.lab3.Geography cannot be cast to java.util.Map
我想我应该修改 MyDevice 或 Geography 保护的构造函数,但我不知道如何修改。任何人都可以帮我吗?谢谢你的时间。
您正在编写 Geography
的实例:
dest.writeParcelable(LastLocalization.get("Geography"), 0);
您正在尝试阅读 Map<String, Geography>
:
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
这不是一回事。
如果您希望恢复的 MyDevice
包含完整的 LastLocalization
地图,您应该:
dest.writeParcelable(LastLocalization, 0);
你的问题是这一行:
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
您正在读取 Geography
类型的 parcelable 并试图将其分配给 Map
.
类型的字段
你应该修改成这样:
Geography geography = in.readParcelable(Georgraphy.class.getClassLoader());
LastLocalization = new HashMap<>();
LastLocalization.put("Geography", geography);
这基本上是将您的操作从 writeToParcel()
中逆转过来。
我有两个可打包的类:
class MyDevice implements Parcelable{
@SerializedName("DeviceName")
public String DeviceName;
@SerializedName("StolenFlag")
public Boolean StolenFlag;
@SerializedName("BatteryLevel")
public int BatteryLevel;
@SerializedName("LastLocalization")
public Map<String,Geography> LastLocalization;
protected MyDevice(Parcel in) {
DeviceName = in.readString();
BatteryLevel = in.readInt();
StolenFlag = in.readByte() !=0;
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
}
....
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(DeviceName);
dest.writeByte((byte) (StolenFlag ? 1 : 0));
dest.writeInt(BatteryLevel);
dest.writeParcelable(LastLocalization.get("Geography"), 0);
}
}
第二个:
class Geography implements Parcelable{
@SerializedName("CoordinateSystemId")
public int CoordinateSystemId;
@SerializedName("WellKnownText")
public String WellKnownText;
protected Geography(Parcel in) {
CoordinateSystemId = in.readInt();
WellKnownText = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(CoordinateSystemId);
dest.writeString(WellKnownText);
}
}
把它付诸实践就可以了。当我试图从意图中得到它时:
Intent intent = getIntent();
ArrayList<MyDevice> MyDevicesList = intent.getParcelableArrayListExtra("data");
我的应用程序崩溃并给出错误:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.andrev.lab3/com.example.andrev.lab3.SecondActivity}: java.lang.ClassCastException: com.example.andrev.lab3.Geography cannot be cast to java.util.Map
我想我应该修改 MyDevice 或 Geography 保护的构造函数,但我不知道如何修改。任何人都可以帮我吗?谢谢你的时间。
您正在编写 Geography
的实例:
dest.writeParcelable(LastLocalization.get("Geography"), 0);
您正在尝试阅读 Map<String, Geography>
:
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
这不是一回事。
如果您希望恢复的 MyDevice
包含完整的 LastLocalization
地图,您应该:
dest.writeParcelable(LastLocalization, 0);
你的问题是这一行:
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
您正在读取 Geography
类型的 parcelable 并试图将其分配给 Map
.
你应该修改成这样:
Geography geography = in.readParcelable(Georgraphy.class.getClassLoader());
LastLocalization = new HashMap<>();
LastLocalization.put("Geography", geography);
这基本上是将您的操作从 writeToParcel()
中逆转过来。