传递值对象

值对象可以理解为自定义的数据类型对象。

为了完成这个知识点的讲解,先来创建一个User类型的类,它有name和age两个属性,然后请添加getter/setter方法,构造方法等基本方法。

public class User {
    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

现在在第一个activity即FirstActivity中,在进行activity跳转代码的地方修改成如下代码

Intent i=new Intent(FirstActivity.this,TwoActivity.class);
i.putExtra("data",new User("miao",20));//这里会有红线,有错误。
startActivity(i);

此时代码会显示有错误,点击错误的提示信息,会看到如下的解决方案

现在我们先选择第二种方式来解决它。

先让User类实现Serializable接口。在类的后面写上implements Serializable,其它的都不需要改变。

public class User implements Serializable{
    ......
}

此时之前的错误已经没有了。现在在接收数据的activity界面代码即TwoActivity中添加如下代码

 //获取传入的Intent
 Intent i=getIntent();
 User user=(User) i.getSerializableExtra("data");

现在从FirstActivity传过来的数据已经传到了TwoActivity中的user对象上了,你可以调用user对象的相关方法来获取其属性的值了,去试试吧!让数据显示在你想要显示的地方。

这种方法用起来是不是很简单,简单的同时当然这是要付出的点代价的,速度有点慢。

下面我们来换种方式来解决问题吧!

User类实现Parcelable接口,这里需要实现两个方法,再自己添加一个属性。

public class User implements Parcelable{
    ......
    @Override
    public int describeContents() {
        return 0;
    }
    
    //序列化数据,系统自动执行
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeInt(getAge());
    }
    public static final Creator<User> CREATOR=new Creator<User>() {
        //通过一个Parcel对象创建对象
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source.readString(),source.readInt());
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

以上是传递一个String类型的数据,那如果要传递多个String类型的数据那该怎么办呢?可以将数据打包到Bundle对象上,此时可以用如下的方法展开,这里就不多言了,感兴趣的可自己试试!

Parcel.writeBundle(Bundle val)

Parcel.readBundle()

以上改完之后,在接收数据的代码改动一下

Intent i=getIntent();
User user=i.getParcelableExtra("data");

好了,此时user已经成功接收FirstActivity发送过来的名字为data的User对象了。大家可以调用相关的方法来获取传过来的信息了。

两种方法已经介绍完毕,现在来具体讲讲两种方式的优缺点。

  1. 通过实现Serializable接口实现值传递,操作简单,序列化操作是由系统完成的,速度较慢。
  2. 通过实现Parcelable接口实现值传递,操作复杂,因为要自己手动编写代码实现,速度较快。

以上的知识是自己看相关教程后将所得到的认知,转换为了文字供大家一起学习参考。

posted on 2017-10-15 10:53  ╰透在骨子里的小傲娇  阅读(113)  评论(0)    收藏  举报