Android:使用Parcelable接口在跳转Activity时传递数据以及错误信息 Parcel: unable to marshal value 的解决

Posted 晚风Sensei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:使用Parcelable接口在跳转Activity时传递数据以及错误信息 Parcel: unable to marshal value 的解决相关的知识,希望对你有一定的参考价值。

Parcelable是android系统中特有的接口,它不像Serializable接口那样是Java语言自带的。Intent也使用Parcelable方式来传递对象的数据,不过它不同于Serializable方式将对象进行序列化,而是通过将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的传递数据类型。

传递对象中没有List类型数据

对自定义的类实现Parcelable接口

注意自定义的类一定要是静态的,否则怎么改都会报错,目前我也不知道为什么,这么用就对了~

public static class Person implements Parcelable

        private String name;
        private int age;

        public void Person()

        protected Person(Parcel in) 
            name = in.readString();
            age  = in.readInt();
        

        public static final Creator<Person> CREATOR = new Creator<Person>() 
            @Override
            public Person createFromParcel(Parcel in) 
                return new Person(in);
            

            @Override
            public Person[] newArray(int size) 
                return new Person[size];
            
        ;

        public Person() 

        

        @Override
        public int describeContents() 
            return 0;
        

        @Override
        public void writeToParcel(Parcel dest, int flags) 
            dest.writeString(name);
            dest.writeInt(age);
        
        
        /*
        	Setter and Getter
        	*/
    

MainActivity

Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();

Person person = new Person();
person.setAge(144);
person.setName("lzh");

bundle.putParcelable("data", person);
intent.putExtras(bundle);

startActivity(intent);

SecondActivity

//获取数据
Person person = getIntent().getParcelableExtra("data");

传递对象中有List类型数据

以菜品类为例,注意和上面没有List类型数据的情况不同。

如果List类型中的类是自定义的,需要对自定义的类也实现Parelable接口,否则就会出现 Parcel: unable to marshal value 的错误。

同时需要在重写createFromParcel方法。

DishData.java

public class DishData implements Parcelable 
    public class DishData implements Parcelable 
    private int id;
    private String name;
    private String peoplenum;
    private String preparetime;
    private String cookingtime;
    private String content;
    private String pic;
    private String tag;
    private List<Material> material = new ArrayList<>();
    private List<Process> process = new ArrayList<>();

    public DishData()


    protected DishData(Parcel in) 
        id = in.readInt();
        name = in.readString();
        peoplenum = in.readString();
        preparetime = in.readString();
        cookingtime = in.readString();
        content = in.readString();
        pic = in.readString();
        tag = in.readString();
        material = in.readArrayList(getClass().getClassLoader());
        process = in.readArrayList(getClass().getClassLoader());
    

    @Override
    public void writeToParcel(Parcel dest, int flags) 
        dest.writeInt(id);
        dest.writeString(name);
        dest.writeString(peoplenum);
        dest.writeString(preparetime);
        dest.writeString(cookingtime);
        dest.writeString(content);
        dest.writeString(pic);
        dest.writeString(tag);
        dest.writeList(material);
        dest.writeList(process);
    

    @Override
    public int describeContents() 
        return 0;
    

    public static final Creator<DishData> CREATOR = new Creator<DishData>() 
        @Override
        public DishData createFromParcel(Parcel in) 
            DishData data = new DishData();
            data.id = in.readInt();
            data.name = in.readString();
            data.peoplenum = in.readString();
            data.preparetime = in.readString();
            data.cookingtime = in.readString();;
            data.content = in.readString();
            data.pic = in.readString();
            data.tag = in.readString();
            
            data.material = new ArrayList<>();
            in.readList(data.material, getClass().getClassLoader());

            data.process = new ArrayList<>();
            in.readList(data.process, getClass().getClassLoader());
            
            return data;
        

        @Override
        public DishData[] newArray(int size) 
            return new DishData[size];
        
    ;

    /*
    	Setter and Getter
    	*/

Material.java

public class Material implements Parcelable 
    private String mname;   
    private String amount;  

    protected Material(Parcel in) 
        mname = in.readString();
        amount = in.readString();
    

    public static final Creator<Material> CREATOR = new Creator<Material>() 
        @Override
        public Material createFromParcel(Parcel in) 
            return new Material(in);
        

        @Override
        public Material[] newArray(int size) 
            return new Material[size];
        
    ;

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel parcel, int i) 
        parcel.writeString(mname);
        parcel.writeString(amount);
    
    
    /*
    	Setter and getter
   		*/

MainActivity传递数据

Intent intent = new Intent(getActivity(), DishActivity.class);
Bundle bundle = new Bundle();

DishData data = new DishData();

data.setId(id);
data.setName(name);
// ...

bundle.putParcelable("dishData", data);
intent.putExtras(bundle);

//跳转到DishActivity
startActivity(intent);

DishActivity获取数据

DishData dishData = getIntent().getParcelableExtra("dishData");
Log.i(TAG, "onCreate: material.size = "+dishData.getMaterial().size());

以上是关于Android:使用Parcelable接口在跳转Activity时传递数据以及错误信息 Parcel: unable to marshal value 的解决的主要内容,如果未能解决你的问题,请参考以下文章

Android--Activity在跳转时携带数据

Android中Parcelable接口使用方法

Android Parcelable接口的使用/序列化数据

Android中Parcelable接口用法

——Parcelable接口的使用(跨进程,Intent传输)

Android中Parcelable接口用法