Error when implementing Parcelable in android

前提是你 提交于 2019-12-11 04:24:32

问题


The following class implements Parcelable class

package mobile.bh.classes;

import java.util.ArrayList;
import java.util.List;

import mobile.bh.activities.MethodStep;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

//simple class that just has one member property as an example
public class Recipe implements Parcelable {
    public int id;
    public String name;
    public List<Ingredient> ingredients;
    public List<MethodStep> method;
    public String comment;
    public String image;
    public Bitmap image2;
    Context mContext;



    public Recipe(Context c){
        mContext = c;
    }
    /* everything below here is for implementing Parcelable */
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(id);
        out.writeString(name);
        out.writeList(ingredients);
        out.writeList(method);
        out.writeString(comment);
        out.writeString(image);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<Recipe> CREATOR = new Parcelable.Creator<Recipe>() {
        public Recipe createFromParcel(Parcel in) {
            return new Recipe(in);
        }

        public Recipe[] newArray(int size) {
            return new Recipe[size];
        }
    };
    // example constructor that takes a Parcel and gives you an object populated with it's values
    private Recipe(Parcel in) {
        id = in.readInt();
        name =in.readString();
        ingredients = (ArrayList<Ingredient>)in.readSerializable();
        method = (ArrayList<MethodStep>)in.readSerializable();
        comment = in.readString();
        image = in.readString();
    }
}

But I got the following error when it reads name :

09-03 16:15:35.364: E/AndroidRuntime(330): Caused by: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = )
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readSerializable(Parcel.java:2022)
09-03 16:15:35.364: E/AndroidRuntime(330):  at mobile.bh.classes.Recipe.<init>(Recipe.java:61)
09-03 16:15:35.364: E/AndroidRuntime(330):  at mobile.bh.classes.Recipe.<init>(Recipe.java:56)
09-03 16:15:35.364: E/AndroidRuntime(330):  at mobile.bh.classes.Recipe$1.createFromParcel(Recipe.java:48)
09-03 16:15:35.364: E/AndroidRuntime(330):  at mobile.bh.classes.Recipe$1.createFromParcel(Recipe.java:1)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readParcelable(Parcel.java:1981)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readValue(Parcel.java:1846)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readListInternal(Parcel.java:2092)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readArrayList(Parcel.java:1536)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readValue(Parcel.java:1867)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Parcel.readMapInternal(Parcel.java:2083)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Bundle.unparcel(Bundle.java:208)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.os.Bundle.getParcelableArrayList(Bundle.java:1144)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.content.Intent.getParcelableArrayListExtra(Intent.java:3448)
09-03 16:15:35.364: E/AndroidRuntime(330):  at mobile.bh.activities.RecipeInfoActivity.onCreate(RecipeInfoActivity.java:56)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-03 16:15:35.364: E/AndroidRuntime(330):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

回答1:


When you use

    out.writeList(ingredients);
    out.writeList(method);

To write data to Parcel, you should use

    ingredients = in.readList();
    method = in.readList();

to read it. And not readSerializable()

Good luck




回答2:


You should read and write using "compatible" methods, so write your data with writeSerializable() instead of writeList() in your writeToParcel() implementation or use readList() instead of readSerializable(). You mix them now which leads to problems.



来源:https://stackoverflow.com/questions/12251437/error-when-implementing-parcelable-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!