固定:在底部回答
我正在为一个项目编写一个Android应用程序,我试图使用parcelable对象。 我有2个可分类的课程。第一个是只有2个参数的普通类。 第二个是具有附加属性的类,以及具有第一个类中的类型的列表以及它的附加对象。
每次我尝试将第二个类的对象传递给另一个Activity时,我得到android.os.BadParcelableException:解组时的ClassNotFoundException
,应用程序关闭。
我现在搜索了几个小时,尝试了多种解决方案,但没有任何帮助。 当我只将第一个类的对象传递给另一个活动时,错误才会出现。
这是我的代码:
package de.softwareproject.v3.testclasses;
import android.os.Parcel;
import android.os.Parcelable;
public class Cart implements Parcelable {
private String name;
private Integer priceInCents;
public Cart() {}
public Cart(Parcel in){
readFromParcel(in);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPriceInCents() {
return priceInCents;
}
public void setPriceInCents(Integer priceInCents) {
this.priceInCents = priceInCents;
}
public static final Parcelable.Creator<Cart> CREATOR = new Parcelable.Creator<Cart>() {
@Override
public Cart createFromParcel(Parcel source) {
return new Cart(source);
}
@Override
public Cart[] newArray(int size) {
return new Cart[size];
}
};
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(priceInCents);
}
private void readFromParcel(Parcel in) {
name = in.readString();
priceInCents = in.readInt();
}
}
我的第二课:
package de.softwareproject.v3.testclasses;
import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class CurrentUser implements Parcelable {
private String username;
private String eMail;
private String password;
private List<Cart> carts;
private Cart activeCart;
public CurrentUser() {}
public CurrentUser(Parcel in) {
readFromParcel(in);
}
private void readFromParcel(Parcel in) {
username = in.readString();
eMail = in.readString();
password = in.readString();
activeCart = in.readParcelable(de.softwareproject.v3.testclasses.Cart.class.getClassLoader());
if (carts == null){ carts = new ArrayList<Cart>(); }
in.readTypedList(carts, Cart.CREATOR);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String geteMail() {
return eMail;
}
public void seteMail(String eMail) {
this.eMail = eMail;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Cart> getCarts() {
return carts;
}
public void setCarts(List<Cart> carts) {
this.carts = carts;
}
public Cart getActiveCart() {
return activeCart;
}
public void setActiveCart(Cart activeCart) {
this.activeCart = activeCart;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(username);
dest.writeString(eMail);
dest.writeString(password);
dest.writeTypedList(carts);
dest.writeParcelable(activeCart, flags);
}
public static final Parcelable.Creator<CurrentUser> CREATOR = new Parcelable.Creator<CurrentUser>() {
@Override
public CurrentUser createFromParcel(Parcel in) {
return new CurrentUser(in);
}
@Override
public CurrentUser[] newArray(int size) {
return new CurrentUser[size];
}
};
}
请帮帮我。
编辑:这里是我的Logcat
03-15 16:24:08.139: E/Parcel(689): Class not found when unmarshalling: ??, e: java.lang.ClassNotFoundException: ??
03-15 16:24:08.149: D/AndroidRuntime(689): Shutting down VM
03-15 16:24:08.149: W/dalvikvm(689): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
03-15 16:24:08.229: E/AndroidRuntime(689): FATAL EXCEPTION: main
03-15 16:24:08.229: E/AndroidRuntime(689): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.softwareproject.v3/de.softwareproject.v3.Startpage}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ??
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.access$600(ActivityThread.java:122)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Handler.dispatchMessage(Handler.java:99)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Looper.loop(Looper.java:137)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.main(ActivityThread.java:4340)
03-15 16:24:08.229: E/AndroidRuntime(689): at java.lang.reflect.Method.invokeNative(Native Method)
03-15 16:24:08.229: E/AndroidRuntime(689): at java.lang.reflect.Method.invoke(Method.java:511)
03-15 16:24:08.229: E/AndroidRuntime(689): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-15 16:24:08.229: E/AndroidRuntime(689): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-15 16:24:08.229: E/AndroidRuntime(689): at dalvik.system.NativeStart.main(Native Method)
03-15 16:24:08.229: E/AndroidRuntime(689): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ??
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readParcelable(Parcel.java:1966)
03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser.readFromParcel(CurrentUser.java:26)
03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser.<init>(CurrentUser.java:19)
03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser$1.createFromParcel(CurrentUser.java:80)
03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser$1.createFromParcel(CurrentUser.java:1)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readParcelable(Parcel.java:1992)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readValue(Parcel.java:1854)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readMapInternal(Parcel.java:2094)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Bundle.unparcel(Bundle.java:223)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Bundle.getParcelable(Bundle.java:1158)
03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.Startpage.onCreate(Startpage.java:34)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.Activity.performCreate(Activity.java:4465)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
03-15 16:24:08.229: E/AndroidRuntime(689): ... 11 more
03-15 16:24:10.289: I/Process(689): Sending signal. PID: 689 SIG: 9
FIX 我终于找到了这个错误,我只是不敢相信它!
搜索差不多1 1/2天,所需要的只是在readFromParcel或writeToParcel中切换最后两个方法,因为它们的顺序不完全相同!!
无法相信,但现在它有效。 对于每个遇到同样错误的人,请检查writeToParcel和readFromParcel的顺序。 Thay必须按照相同的顺序。
祝你有个美好的一天,基督徒**
答案 0 :(得分:33)
FIX我终于找到了这个错误,我只是不能相信它!!! ...
搜索差不多1 1/2天,所需要的只是在readFromParcel或writeToParcel中切换最后两个方法,因为它们的顺序不完全相同!!
无法相信,但现在它有效。对于每个遇到同样错误的人,请检查writeToParcel和readFromParcel的顺序。 Thay必须按照相同的顺序。
(Christian Risch自己解决了这个问题。不过,我相信这个网站的整洁。也许他会自己解决问题)
答案 1 :(得分:1)
对于任何偶然发现此问题的人,以上答案对我来说都是有效的,但不完全是。 我的问题是我的字段初始化器的顺序不正确。
代码如下:
protected Shop(Parcel in) {
id = in.readInt();
contactInfo = in.readParcelable(ShopContactInfo.class.getClassLoader());
name = in.readString();
}
在我的课堂上,这些字段按以下顺序声明:
@SerializedName("Id")
public int id;
@SerializedName("Name")
public String name;
@SerializedName("ContactInfo")
public ShopContactInfo contactInfo;
注意
name = in.readString();
在
下contactInfo = in.readParcelable(ShopContactInfo.class.getClassLoader());
以下代码对其进行了修复:
protected Shop(Parcel in) {
id = in.readInt();
name = in.readString();
contactInfo = in.readParcelable(ShopContactInfo.class.getClassLoader());
}
答案 2 :(得分:0)
@覆盖 public void writeToParcel(Parcel dest,int flags){ //也可以先捆绑......
dest.writeString(songs_id);
dest.writeInt(check_song_favorite);
dest.writeString(name);
dest.writeString(track_image);
dest.writeString(created_date);
dest.writeString(status);
dest.writeString(track);
dest.writeString(artist_name);
dest.writeString(uploader_name);
dest.writeString(play_count);
dest.writeString(share_count);
dest.writeString(favorite_count);
dest.writeString(genre);
dest.writeString(user_id);
dest.writeString(offline_download);
dest.writeString(slug);
}
/**
* Creates ArtistParcelable model from Parcel.
*/
public static final Parcelable.Creator<PlayerData> CREATOR = new Creator<PlayerData>() {
@Override
public PlayerData createFromParcel(Parcel source) {
String songs_id = source.readString();
int check_song_favorite = source.readInt();
String name = source.readString();
String track_image = source.readString();
String created_date = source.readString();
String status = source.readString();
String track = source.readString();
String artist_name = source.readString();
String uploader_name = source.readString();
String play_count = source.readString();
String share_count = source.readString();
String favorite_count = source.readString();
String genre = source.readString();
String user_id = source.readString();
String offline_download = source.readString();
String slug = source.readString();
return new PlayerData(check_song_favorite,songs_id, name, created_date, track_image, status, track,
artist_name, uploader_name, play_count, share_count, favorite_count,genre,user_id,offline_download,slug);
}
@Override
public PlayerData[] newArray(int size) {
return new PlayerData[size];
}
};
尝试以相同的方式管理writeToParcel和readFromParcel。解决了我的问题。