在Android应用程序错误解组自定义parcelable类 [英] Unmarshalling errors in Android app with custom parcelable classes

查看:827
本文介绍了在Android应用程序错误解组自定义parcelable类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有关我的Andr​​oid应用程序,我得到的一些数据编出的错误,虽然我觉得我已经通过 Parcelable 取值做到这一点是需要适当地保存和加载对象的一切。你能告诉我什么地方错了我的code?

错误1:

 了java.lang.RuntimeException:无法启动活动ComponentInfo
致:java.lang.RuntimeException的:地块android.os.Parcel@41279860:解组未知类型code 6619241偏移量1372
在android.os.Parcel.readValue(Parcel.java:1922)
在android.os.Parcel.readMapInternal(Parcel.java:2094)
在android.os.Bundle.unparcel(Bundle.java:223)
在android.os.Bundle.getParcelable(Bundle.java:1158)
在android.app.Activity.onCreate(Activity.java:860)
在my.app.package.PlayComputer.onCreate(PlayComputer.java:1012)
在android.app.Activity.performCreate(Activity.java:4465)
 

1012 Line在 MyActivity 是调用 super.onCreate(savedInstanceState);在<$ C $ C>活动的的onCreate()

 保护无效的onSaveInstanceState(包savedInstanceState){
    如果(myObject的== NULL){
        savedInstanceState.putParcelable(myObject的,NULL);
    }
    其他 {
        savedInstanceState.putParcelable(myObject的,myObject的);
    }
    savedInstanceState.putInt(...);
    savedInstanceState.putString(...);
    savedInstanceState.putBoolean(...);
    super.onSaveInstanceState(savedInstanceState);
}
 

myObject的是类为MyObject 这有以下几种方法:

 公共无效writeToParcel(包裹出来,诠释标志){
    out.writeIntArray(...);
    out.writeInt(...);
    out.writeStringArray(...);
    out.writeString(...);
    out.writeParcelableArray(...,旗);
}

公共静态最终Parcelable.Creator&LT;为MyObject&GT; CREATOR =新Parcelable.Creator&LT;为MyObject&GT;(){
    公众为MyObject createFromParcel(包裹中){
        尝试 {
            如果(在== NULL){
                返回null;
            }
            其他 {
                返回新MyObject来(在);
            }
        }
        赶上(例外五){
            返回null;
        }
    }
    公众为MyObject [] newArray(INT尺寸){
        返回新的MyObject【尺寸】;
    }
};

私人为MyObject(包裹中){
    in.readIntArray(...);
    ... = in.readInt();
    in.readStringArray(...);
    ... = in.readString();
    ... =(OtherObject [])in.readParcelableArray(OtherObject.class.getClassLoader());
}
 

错误2:

 了java.lang.RuntimeException:无法启动活动ComponentInfo
android.os.BadParcelableException:ClassNotFoundException的解组时,产生的原因:
在android.os.Parcel.readParcelable(Parcel.java:1971)
在android.os.Parcel.readValue(Parcel.java:1859)
在android.os.Parcel.readMapInternal(Parcel.java:2099)
在android.os.Bundle.unparcel(Bundle.java:223)
在android.os.Bundle.getParcelable(Bundle.java:1158)
在android.app.Activity.onCreate(Activity.java:905)
在my.app.package.PlayComputer.onCreate(的SourceFile:1012)
 

相同的文件和类。

错误3:

 了java.lang.RuntimeException:无法启动活动ComponentInfo
致:java.lang.RuntimeException的:地块android.os.Parcel@4051aff8:解组未知类型code 7340149偏移量1276
在android.os.Parcel.readValue(Parcel.java:1913)
在android.os.Parcel.readMapInternal(Parcel.java:2083)
在android.os.Bundle.unparcel(Bundle.java:208)
在android.os.Bundle.getParcelable(Bundle.java:1100)
在my.app.package.PlayComputer.onCreate(的SourceFile:1111)
 

这一次,造成行(1111)是下列之一:

  myObject的=(MyObject来)savedInstanceState.getParcelable(myObject的);
 

解决方案

Android有两个不同的类加载器:框架类加载器(它知道如何加载安卓类)和APK类加载器(它知道如何加载您的code )。该APK类加载器已经框架类加载器设置为其父,这意味着它也可以装载Android的类。

错误#2可能是由所述包使用的框架的类加载器,以便它不知道你的类的引起的。我认为,当机器人需要坚持你的包,并(在后台运行时内存为例)以后恢复它会发生这种情况。您可以通过设置APK的类加载器的捆绑解决这个问题:

  

savedInstanceState.setClassLoader(的getClass()getClassLoader());

错误#1和#3是更神秘的,你也许写在 writeToParcel空值()? Android不喜欢那种很我害怕。

For my Android application, I get several unmarshalling errors although I think I've done everything that is needed to properly save and load objects via Parcelables. Can you tell me what's wrong with my code?

Error 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)

Line 1012 in MyActivity is the call to super.onCreate(savedInstanceState); in the Activity's 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 is of class MyObject which has the following methods:

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

Error 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)

Same files and classes.

Error 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)

This time, the causing line (1111) is the following one:

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

解决方案

Android has two different classloaders: the framework classloader (which knows how to load Android classes) and the APK classloader (which knows how to load your code). The APK classloader has the framework classloader set as its parent, meaning it can also load Android classes.

Error #2 is likely caused by the Bundle using the framework classloader so it doesn't know of your classes. I think this can happen when Android needs to persist your Bundle and later restore it (for example when running out of memory in the background). You can fix this by setting the APK classloader on the bundle:

savedInstanceState.setClassLoader(getClass().getClassLoader());

Error #1 and #3 are more mysterious, are you perhaps writing null values in writeToParcel()? Android doesn't like that very much I'm afraid.

这篇关于在Android应用程序错误解组自定义parcelable类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆