Android Parcelable问题

时间:2014-01-24 09:39:55

标签: android android-intent

我目前正在尝试将parceablearraylistmylogin活动传递到我的主要活动,但获得了

java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.muuves.introround/com.muuves.introround.activities.MainActivity}:    java.lang.RuntimeException: Parcel android.os.Parcel@41ef90a8: Unmarshalling unknown type  code 7536741 at offset 684

以下是我的parceable个对象

    public class Challenge implements Parcelable {

private Integer id;
private Integer challenger_id;
private Integer friend_id;
private String artist_name;
private String song_name;
private String image_url;
private String song_url;
private String answer_url;
private int challenge_attempts_left;
private int answer;
private Person person;
private Person friend;

public Challenge() {
}

public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public Integer getChallenger_id() {
    return challenger_id;
}
public void setChallenger_id(Integer challenger_id) {
    this.challenger_id = challenger_id;
}

public Integer getFriend_id() {
    return friend_id;
}
public void setFriend_id(Integer friend_id) {
    this.friend_id = friend_id;
}
public String getArtist_name() {
    return artist_name;
}
public void setArtist_name(String artist_name) {
    this.artist_name = artist_name;
}
public String getSong_name() {
    return song_name;
}
public void setSong_name(String song_name) {
    this.song_name = song_name;
}
public String getImage_url() {
    return image_url;
}
public void setImage_url(String image_url) {
    this.image_url = image_url;
}
public String getSong_url() {
    return song_url;
}
public void setSong_url(String song_url) {
    this.song_url = song_url;
}
public String getAnswer_url() {
    return answer_url;
}
public void setAnswer_url(String answer_url) {
    this.answer_url = answer_url;
}
public int getChallenge_attempts_left() {
    return challenge_attempts_left;
}
public void setChallenge_attempts_left(int challenge_attempts_left) {
    this.challenge_attempts_left = challenge_attempts_left;
}
public int getAnswer() {
    return answer;
}
public void setAnswer(int answer) {
    this.answer = answer;
}
public Person getPerson() {
    return person;
}
public void setPerson(Person person) {
    this.person = person;
}
public Person getFriend() {
    return friend;
}

public void setFriend(Person friend) {
    this.friend = friend;
}
@Override
public int describeContents() {
    return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeInt(challenger_id);
    dest.writeInt(friend_id);
    dest.writeString(artist_name);
    dest.writeString(image_url);
    dest.writeString(song_url);
    dest.writeString(answer_url);
    dest.writeInt(challenge_attempts_left);
    dest.writeInt(answer);
    dest.writeParcelable(person, flags);
    dest.writeParcelable(friend, flags);
}

public static final Parcelable.Creator<Challenge> CREATOR = new Parcelable.Creator<Challenge>() {
    @Override
    public Challenge createFromParcel(Parcel in) {
        Challenge challenge = new Challenge();
        challenge.setId(in.readInt());
        challenge.setChallenger_id(in.readInt());
        challenge.setFriend_id(in.readInt());
        challenge.setArtist_name(in.readString());
        challenge.setSong_name(in.readString());
        challenge.setImage_url(in.readString());
        challenge.setSong_url(in.readString());
        challenge.setAnswer_url(in.readString());
        challenge.setChallenge_attempts_left(in.readInt());
        challenge.setAnswer(in.readInt());
        challenge.setPerson((Person) in.readParcelable(Person.class.getClassLoader()));
        challenge.setFriend((Person) in.readParcelable(Person.class.getClassLoader()));
        return challenge;
    }

    @Override
    public Challenge[] newArray(int size) {
        return new Challenge[size];
    }
};


}

public class Person implements Parcelable {

private int id;
private String first_name;
private String last_name;
private String image_url;

public Person(){
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getFirst_Name() {
    return first_name;
}

public void setFirst_Name(String first_name) {
    this.first_name = first_name;
}

public String getLast_Name() {
    return last_name;
}

public void setLast_Name(String last_name) {
    this.last_name = last_name;
}

public String getImage_url() {
    return image_url;
}

public void setImage_url(String image_url) {
    this.image_url = image_url;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(first_name);
    dest.writeString(last_name);
    dest.writeString(image_url);
}

public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
    @Override
    public Person createFromParcel(Parcel in) {
        Person person = new Person();
        person.setId(in.readInt());
        person.setFirst_Name(in.readString());
        person.setLast_Name(in.readString());
        person.setImage_url(in.readString());
        return person;
    }

    @Override
    public Person[] newArray(int size) {
        return null;
    }
};
}

登录活动

        @Override
    public void preLoadDetails(Details details) {
    Intent intent = new Intent(this, MainActivity.class);
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList("receive", details.getReceive());
    intent.putExtras(bundle);
    startActivity(intent);
    }

MainActivity

     @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = this.getIntent().getExtras();
    ArrayList<Challenge> friends = bundle.getParcelableArrayList("receive");

    mContent = new MainFragment(0);
    mContent.setArguments(getIntent().getExtras());

    // set the Above View
    setContentView(R.layout.home_frame);
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frame, mContent).commit();

    // set the Behind View
    setBehindContentView(R.layout.menu_frame);
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.menu_frame, new MenuFragment()).commit();

    // Disable
    getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}

试图在通过日修复它并且在我所知道的地方得不到的是挑战对象中的那个人parceable对象总是为空但是当我把它们放在捆绑包中时它们不是。

感谢任何输入。

4 个答案:

答案 0 :(得分:0)

那些Integer类型可以是nullint,您需要正确处理这种情况。

例如,我有这样的实用功能:

static public Integer readInteger(Parcel in){
    if(in.readInt() == 1){
        return in.readInt();
    }else{
        return null;
    }
}

static public void writeInteger(Integer value, Parcel out){
    if(value != null){
        out.writeInt(1);
        out.writeInt(value);
    }else{
        out.writeInt(0);
    }
}

答案 1 :(得分:0)

类挑战中的第一件事你使用Integer属性,你就是“int”那些是2个不同的东西。

我自己如何做事的例子:

public Podcast(Parcel parcel) {
    id = parcel.readLong();
    title = parcel.readString();
    subtitle = parcel.readString();
    summary = parcel.readString();
    duration = parcel.readString();
    author = parcel.readString();
    date = parcel.readString();
    mp3 = parcel.readString();
    podcastCategoryId = parcel.readLong();
}

@Override
public int describeContents() {
    // not used
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeLong(id);
    dest.writeString(title);
    dest.writeString(subtitle);
    dest.writeString(summary);
    dest.writeString(duration);
    dest.writeString(author);
    dest.writeString(date);
    dest.writeString(mp3);
    dest.writeLong(podcastCategoryId);
}

public static Creator<Podcast>  CREATOR = new Creator<Podcast>() {

                                            public Podcast createFromParcel(Parcel parcel) {
                                                return new Podcast(parcel);
                                            }

                                            public Podcast[] newArray(int size) {
                                                return new Podcast[size];
                                            }
                                        };

答案 2 :(得分:0)

@Override
public Person[] newArray(int size) {
    return null;
}

你应该在那里创建一个大小的数组并将其返回。

@Override
public Person[] newArray(int size) {
    return new Person[size];
}

答案 3 :(得分:0)

解决它实际上非常简单,当我写入包裹时忘记了歌曲网址。任何当我错过了写作,这就是为什么我得到了人物对象的奇怪异常。它期待一个人的对象,但正在得到别的东西。浪费了1天哦:(

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeInt(challenger_id);
    dest.writeInt(friend_id);
    dest.writeString(artist_name);
    **dest.writeString(song_name);**
    dest.writeString(image_url);
    dest.writeString(song_url);
    dest.writeString(answer_url);
    dest.writeInt(challenge_attempts_left);
    dest.writeInt(answer);
    dest.writeParcelable(person, flags);
    dest.writeParcelable(friend, flags);
}