2014-01-24 2 views
1

В настоящее время я пытаюсь передать parceablearraylist от mylogin деятельности к моей основной деятельности, но получениеAndroid Parceable вопрос

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.muuves.introround/com.muuves.introround.activities.MainActivity}: java.lang.RuntimeException: Parcel [email protected]: 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 в объекте вызов всегда нулевой, но они не являются, когда я положил их в пакет.

Цените любой вход.

+0

Там, кажется, проблема с наличием два одинаковых parceable типов объектов, то есть человек, они, кажется, мешают друг другу вызов, когда я удалить один он фиксирует, но мне действительно нужно оба объекта. – user1408682

ответ

0

Решено было фактически очень просто, забыл URL-адрес песни, когда я писал на посылку. Любые, когда я пропустил эту запись, именно поэтому я получил странное исключение для объекта person. он ожидал, что объект человека, но получит что-то еще. 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); 
} 
0

Этот тип Integer может быть null или int, вам необходимо правильно обработать эту ситуацию.

Например, у меня есть вспомогательные функции, как это:

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); 
    } 
} 
0

Первое, что в классе Challenge, который вы используете атрибуты Integer и вы PARCE «Int» те 2 diferents вещи.

Exemple, как я делаю вещи себя:

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]; 
              } 
             }; 
+0

Это работало нормально, когда я проходил между фрагментами, но, похоже, останавливается, когда мне нужно отдельное действие для входа в систему из-за дизайнерских решений. – user1408682

+0

Между действиями вы используете \t intent.putExtra («...», объект), и getIntent(). getParcelableExtra ("...");? –

+0

вы также можете сделать это как пакет Bundle bundle = new Bundle(); \t \t bundle.putParcelableArrayList ("receive", details.getReceive()); intent.putExtras (расслоение); – user1408682

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

Вы должны создать там массив такого размера и вернуть его.

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

Нет, это не имеет значения, это объект одного человека, а не массив. Я все равно пробовал, но до сих пор не работал. – user1408682

+0

В любом случае вы должны это сделать, его хороший стиль кодирования! – Kitesurfer

+0

ура я изменил его – user1408682

Смежные вопросы