Android中对象的传递

来源:互联网 发布:网络销售是怎么做的 编辑:程序博客网 时间:2024/06/01 09:59

我们知道,当我们在两个activity中传输 实体类对象 的时候有三种方法。第一、实现Serializable接口,这种比较简单,直接声明就好;第二种,实现Parcelable接口,这种方式就比较复杂,往往需要写多些代码去实现,不过效率就比较高;第三种,转换为json传递。

我们先看看实现Serializable接口的方法

首先创建一个实体类,实现serializable接口

public class GirlFriend implements Serializable{    private String name;    private Integer age;    private String location;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public String getLocation() {        return location;    }    public void setLocation(String location) {        this.location = location;    }}

然后我们创建两个activity A和B

public class TestActivityA extends Activity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //创建一个按钮        TextView tvClick = new TextView(this);        tvClick.setText("来点我啊,点我获取对象");        setContentView(tvClick);        //创建一个实体类对象        GirlFriend girlF = new GirlFriend();        girlF.setName("喵喵喵");        girlF.setAge(18);        girlF.setLocation("西安培华学院");        //点击传递对象到下一个页面        final Intent intent = new Intent();        Bundle bun = new Bundle();        bun.putSerializable("girlF",girlF);        intent.putExtras(bun);        intent.setClass(this,TestActivityB.class);        tvClick.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                startActivity(intent);            }        });    }}

activityB:

public class TestActivityB extends Activity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView textView = new TextView(this);        setContentView(textView);        GirlFriend girlFriend = (GirlFriend) getIntent().getSerializableExtra("girlF");        textView.setText("你获得了一个新女朋友\n名字叫:" +                girlFriend.getName() + "\n年龄为:" + girlFriend.getAge() + "\n现在所在位置:" + girlFriend.getLocation()        );    }}

这就就实现了我们用serializable来传递对象了。

如果传递的是List<Object>,可以把list强转成Serializable类型,而且object类型也必须实现了Serializable接口

Intent.putExtras(key, (Serializable)list)
接收

(List<Object>)getIntent().getSerializable(key)

实现Parcelabel 接口

首先是我们的实体类

这里写图片描述

我们先生成 getter setter方法。

然后我们在光标位置按Alt+Insert 会弹出如下菜单:

这里写图片描述

我们选择Parcelable选项,然后进入我们的变量选择框:

这里写图片描述

然后点击OK 就为我们生成了完成的Parcelable的代码:

public class GirlFriend implements Parcelable{    private String name;    private Integer age;    private String location; public String getName() {return name;}    public void setName(String name) {this.name = name;}    public Integer getAge() {return age;}    public void setAge(Integer age) {this.age = age;}    public String getLocation() {return location;}    public void setLocation(String location) {this.location = location;}    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(this.name);        dest.writeValue(this.age);        dest.writeString(this.location);    }    public GirlFriend() {    }    protected GirlFriend(Parcel in) {        this.name = in.readString();        this.age = (Integer) in.readValue(Integer.class.getClassLoader());        this.location = in.readString();    }    public static final Creator<GirlFriend> CREATOR = new Creator<GirlFriend>() {        @Override        public GirlFriend createFromParcel(Parcel source) {            return new GirlFriend(source);        }        @Override        public GirlFriend[] newArray(int size) {            return new GirlFriend[size];        }    };}

接着 我们在Activity中来传递:

还是用我们上面的两个activity ,只需要把A中的 putSerializable 改为 putParcelable 即可。
这里写图片描述

然后在B中。也是只改接收的那一句:

这里写图片描述

这样我们的 用parcelable 传递对象也就完成了。

转换为json传递

这种方法里面,我们的实体类GirlFriend 里面 什么接口都不用实现,实现getter setter方法就行。

然后在A中传递时候为:

这里写图片描述

在B中接收为:

这里写图片描述

其他的什么都不用改。就完成了这种方式的传递。

为什么选择Parcelable

从上面的两种方法来看。明显的实现Serializable 接口的写法简单。尽管我们用了Android Parcelabel code generator 插件之后 实现Parcelable 接口的写法也简单了许多,但是终归还是比用Serializable 多一步。那么什么时候需要用Parcelable 呢? 那就是 效率!效率!效率!

附上一个别人的测试连接:http://blog.prolificinteractive.com/2014/07/18/why-we-love-parcelable/

参考了:为什么说Parcelable 比Serializable更高效

0 0