Intereting Posts
Android View выравнивается снизу (программно) без XML Отправить уведомление GCM автономному устройству Когда Android делает свой недавний скриншот приложений? Отказ коренного кода на libwebviewchromium.so Android-приложение – как отобразить список элементов и сделать их интерактивными Android – количество просмотров списка просмотров Espresso – Как проверить, запускается ли действие после выполнения определенного действия? Создание прозрачности TileOverlays Событие нажатия кнопки Android AppWidget, которое не было получено после остановки принудительной остановки дома Как исправить IncompatibleClassChangeError во время Android Jackson Parsing, используя аннотации в Android Lollipop? FirebaseApp с именем не существует Различия между textMultiLine и textLongMessage Android M – приложение не работает в Chrome OnMapReady не вызывает, даже если отображение карты без ошибок Как я могу получить права root через Android SDK?

Unmarshalling ошибки в приложении Android с настраиваемыми классными классами

Для моего приложения для Android я получаю несколько ошибок, не Parcelable с Parcelable хотя я думаю, что сделал все, что необходимо для правильного сохранения и загрузки объектов через Parcelable s. Не могли бы вы рассказать мне, что случилось с моим кодом?

Ошибка 1:

 java.lang.RuntimeException: Unable to start activity ComponentInfo Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@41279860: Unmarshalling unknown type code 6619241 at offset 1372 at android.os.Parcel.readValue(Parcel.java:1922) at android.os.Parcel.readMapInternal(Parcel.java:2094) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.getParcelable(Bundle.java:1158) at android.app.Activity.onCreate(Activity.java:860) at my.app.package.PlayComputer.onCreate(PlayComputer.java:1012) at android.app.Activity.performCreate(Activity.java:4465) 

Строка 1012 в MyActivity – это вызов super.onCreate(savedInstanceState); В onCreate() .

 protected void onSaveInstanceState(Bundle savedInstanceState) { if (myObject == null) { savedInstanceState.putParcelable("myObject", null); } else { savedInstanceState.putParcelable("myObject", myObject); } savedInstanceState.putInt(...); savedInstanceState.putString(...); savedInstanceState.putBoolean(...); super.onSaveInstanceState(savedInstanceState); } 

MyObject имеет класс MyObject который имеет следующие методы:

 public void writeToParcel(Parcel out, int flags) { out.writeIntArray(...); out.writeInt(...); out.writeStringArray(...); out.writeString(...); out.writeParcelableArray(..., flags); } public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() { public MyObject createFromParcel(Parcel in) { try { if (in == null) { return null; } else { return new MyObject(in); } } catch (Exception e) { return null; } } public MyObject[] newArray(int size) { return new MyObject[size]; } }; private MyObject(Parcel in) { in.readIntArray(...); ... = in.readInt(); in.readStringArray(...); ... = in.readString(); ... = (OtherObject[]) in.readParcelableArray(OtherObject.class.getClassLoader()); } 

Ошибка 2:

 java.lang.RuntimeException: Unable to start activity ComponentInfo Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: at android.os.Parcel.readParcelable(Parcel.java:1971) at android.os.Parcel.readValue(Parcel.java:1859) at android.os.Parcel.readMapInternal(Parcel.java:2099) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.getParcelable(Bundle.java:1158) at android.app.Activity.onCreate(Activity.java:905) at my.app.package.PlayComputer.onCreate(SourceFile:1012) 

Те же файлы и классы.

Ошибка 3:

 java.lang.RuntimeException: Unable to start activity ComponentInfo Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4051aff8: Unmarshalling unknown type code 7340149 at offset 1276 at android.os.Parcel.readValue(Parcel.java:1913) at android.os.Parcel.readMapInternal(Parcel.java:2083) at android.os.Bundle.unparcel(Bundle.java:208) at android.os.Bundle.getParcelable(Bundle.java:1100) at my.app.package.PlayComputer.onCreate(SourceFile:1111) 

На этот раз вызывающая строка (1111) следующая:

 myObject = (MyObject) savedInstanceState.getParcelable("myObject"); 

Solutions Collecting From Web of "Unmarshalling ошибки в приложении Android с настраиваемыми классными классами"

Android имеет два разных загрузчика классов: класс classloader (который знает, как загружать классы Android) и загрузчик классов APK (который знает, как загрузить ваш код). У загрузчика классов APK установлен класс загрузчика классов как его родительский элемент, то есть он также может загружать классы Android.

Ошибка № 2, скорее всего, вызвана Bundle с использованием класса classloader, поэтому он не знает ваших классов. Я думаю, что это может произойти, когда Android необходимо сохранить ваш Bundle, а затем восстановить его (например, при нехватке памяти в фоновом режиме). Вы можете исправить это, установив загрузчик классов APK в комплекте:

savedInstanceState.setClassLoader (GetClass () getClassLoader ().);

Ошибка №1 и №3 более загадочна, возможно, вы пишете нулевые значения в writeToParcel() ? Боюсь, Android этого не очень нравится.

По внешнему виду, createFromParcel и newArray должны быть переопределены следующим образом:

 public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() { @Override public MyObject createFromParcel(Parcel in) { MyObject myObj = new MyObject(); myObj.intArray = in.readIntArray(...); myObj.intValue = in.readInt(...); // .... // IN THE SAME ORDER THAT IS WRITTEN OUT AS PER writeToParcel! // return myObj; } @Override public MyObject[] newArray(int size) { return new MyObject[size]; } }; 

Редактировать:

Я забыл упомянуть, что для того, чтобы это работало, должен был быть пустой конструктор!

 public MyObject(){} 

Перед чтением из набора пакетов ClassLoader

bundle.setClassLoader (GetClass () getClassLoader ().);

Это спасло мое время!