Андроид | Разупорядочение неизвестного типа при использовании Parcelable Data в пакетах

У меня проблема с Parcelable Data в ArrayList, отправляющемся через два действия с использованием Android.Bundle

У меня есть два действия (A и B).

В классе Аааа:

ArrayList<Model> mModelList = new ArrayList<Model>
//Fill ArrayList with a few Model-Objects

Bundle mBundle = new Bundle;
Intent mIntent = new Intent(Aaaa.this, Bbbb.class);

mBundle.putParcelableArrayList("models", mModelList);
mIntent.putExtras(mBundle);

startActivity(mIntent);

В Bbb.классе:

Bundle mBundle = getIntent().getExtras();
ArrayList<Model> = mBundle.getParcelableArrayList("models");

Model.class реализует Parcelable.

Итак, проблема в том. Когда я заполняю ArrayList (в Aaaa.class) и помещаю его в Bundle, я вижу, что Bundle содержит различные объекты из списка. Когда я затем пытаюсь заполнить список в Bbbb.class, возникает исключение.

 ERROR/AndroidRuntime(11109): FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{test/test.activities.Bbbb}: java.lang.RuntimeException: Parcel android.os.Parcel@405585d0: Unmarshalling unknown type code 7667810 at offset 144
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@405585d0: Unmarshalling unknown type code 7667810 at offset 144
    at android.os.Parcel.readValue(Parcel.java:1913)
    at android.os.Parcel.readListInternal(Parcel.java:2092)
    at android.os.Parcel.readArrayList(Parcel.java:1536)
    at android.os.Parcel.readValue(Parcel.java:1867)
    at android.os.Parcel.readMapInternal(Parcel.java:2083)
    at android.os.Bundle.unparcel(Bundle.java:208)
    at android.os.Bundle.getParcelableArrayList(Bundle.java:1144)
    at test.activities.Bbbb.onCreate(Bbbb.java:52)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
    ... 11 more

Line52 это

ArrayList<Model> = mBundle.getParcelableArrayList("models");

У меня нет абсолютно никакой идеи, в чем здесь проблема, Model.class отлично работает с другими Bundle - Intents.

Обновлять:

Класс модели следующим образом.

public class Model implements Parceleble{

  private String name;
  private String address;

  public Model(Parcel parcel){
  }
  public Model(){
  }
  public Model(String name, String address){
    this.name = name;
    this.address = address;
  }

  //Getter and Setter

  //equals, HashCode, toString (autoGenerated from Idea)

  @Override
  public void writeToParcel(Parcel parcel, int i){
    parcel.writeString(name);
    parcel.writeString(address);
  }

  public void readFromParcel(Parcel parcel){
    this.name = parcel.readString();
    this.address = parcel.readString();
  }

  public static Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>(){
  @Override
  public Model createFromParcel(Parcel parcel){
    return new Model(parcel);
  }

  @Override
  public Model[] new Array(int size){
    return new Model[size]
  }
};
}

person Chris    schedule 15.03.2012    source источник
comment
Можете ли вы опубликовать свой класс модели?   -  person yorkw    schedule 16.03.2012
comment
@yorkw Опубликуйте Model.class по своему желанию.   -  person Chris    schedule 16.03.2012


Ответы (2)


Ваша реализация Parceleble мне кажется не совсем правильной, посмотрите пример кода в API чтобы узнать, какие методы/конструкторы необходимо переопределить:

... ...

// ==================== Parcelable ====================
public int describeContents() {
  return 0;
}

public void writeToParcel(Parcel parcel, int flags) {
  parcel.writeString(name);
  parcel.writeString(address);
}

private Model(Parcel in) {
  name = in.readString();
  address = in.readString();
}

public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() {
  public Model createFromParcel(Parcel in) {
    return new Model(in);
  }

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

... ...

Попробуйте этот код и посмотрите, поможет ли он.

person yorkw    schedule 16.03.2012
comment
Привет @yorkw большое спасибо за ваш ответ. Проблема была в реализации модели, особенно в парцелле-создателе (частная модель(парцелла в)). - person Chris; 21.03.2012
comment
Я не понимаю, чем этот блок кода отличается от кода класса Model, предоставленного OP, или он был обновлен позже? - person Christian García; 14.06.2013
comment
В реализации @ChristianGarcía OP отсутствует метод describeContents, который очень важен, поскольку он объясняет содержимое посылки (объекты внутри нее). Я надеюсь, что вы ясно теперь. - person sud007; 26.09.2016

Я потратил много времени, чтобы узнать, что это такое, и я думаю, что это ошибка. Позвольте мне объяснить:

Если в вашей модели есть строковые поля, Android не может их очень хорошо восстановить по методу

Parcel.readString()

Он пытается преобразовать строку и дать вам неизвестный тип, например, неизвестный символ. Просто выполняя тест, если вы используете модель с частями без строковых полей, это происходит отлично.

Я не знаю, что делать и почему это происходит со строковыми полями.

Чтобы решить проблему, я подумал передать список объектов модели следующему действию с использованием базы данных, возможно, это не лучшая идея, но у меня нет другого.

person ggomesfe    schedule 01.06.2012