内容分享-->
我们知道Acitivty之间传基础类型,String都可以通过android提供的api实现.
另外如果要传自定义对象,有两种方式,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
方式一:实现Serializable接口
实现Serializable接口,然后提供一个serialVersionUID就可以了.
serialVersionUID的作用:
通过判断实体类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
例子如下:
public class Foo implements Serializable {
private static final long serialVersionUID = 2779127728356590289L;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然后在传值的时候使用Intent类的putExtra就可以了
public Intent putExtra(String name, Serializable value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putSerializable(name, value);
return this;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
传值
Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo ", foo);
startActivity(intent);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
取值
Foo foo = (Foo) getIntent().getSerializableExtra("foo");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Serializable是一个标准的Java接口。你可以实现Serializable接口和添加覆盖方法。这种方法的的问题是它内部实现使用了反射,并且是通过IO读写完成的,这个过程是很缓慢的。这种方式会创建很多临时对象,并引起相当多的GC。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
方式二:实现Parcelable接口
使用实现Parcelable方式传值,它是直接在内存中读写,很明显内存的读写速度通常大于IO读写
public class Person implements Parcelable{
/* 1、复写describeContents方法和writeToParcel方法 2、实例化静态内部对象CREATOR,实现接口Parcelable.Creator 。 */
private String name;
private int age;
private String address;
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
protected Person(Parcel in) {
//注意读数据的顺序要和写入的时候一致
name = in.readString();
age = in.readInt();
address = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(address);
}
public static final Creator CREATOR = new Creator() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
//getter和setter的代码被省略
public void setAddress(String address) {
this.address = address;
}
@Override
public int describeContents() {
return 0;
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
实现了parcelable接口后,使用以下api就可以了
public Intent putExtra(String name, Parcelable value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putParcelable(name, value);
return this;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
传值
Person person = new Person("jack",20,"somewhere");
Intent intent = new Intent();
intent.putExtra("person",person);
startActivity(intent);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
取值
Person person = getIntent().getParcelableExtra("person");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
总结
Parcelable接口比Serializable效率更高,速度更快
实现Parcelable接口需要写更多代码
Serializable接口容易实现
Serializable接口创建很多临时对象,导致一些垃圾收集
在android开发工作中有很多人也知道Serializable接口效率比实现Parcelable方式低,但是很多人还是使用实现Serializable的方式,因为他们认为Serializable要写的代码很少,这样可以偷懒了.
一般在数据很小的情况下,这两种方式的差异并不明显,但是数据量大了就另当别论 了.
博主在之前接手了某个项目中的一个模块,其中两个界面间要传一个非常庞大的对象(航班数据,里面包含航班信息,天气信息,前序航班的信息,后序航班的信息等等),要将这样一个对象传到另外一个界面去,界面间跳转都能感受到卡顿了,原因就是这个对象是通过实现Serializable接口来传值的,我立马意识到应该换成Parcelable了.
在前面我们说过,实现Parcelable有两步要做:
1、复写describeContents方法和writeToParcel方法
2、实例化静态内部对象CREATOR,实现接口Parcelable.Creator 。
当时我打开了这个航班数据类,瞬间就懵逼了,就这个类本身有几十个Filed,其中大部分Filed也是自定义的类,自定义类的类中又包含其他自定义类,等于说要将这些数据都传到另外一个界面去的话,这些自定义类都要做以上两部工作,那可是要写死人的,我终于知道之前的人为什么要偷懒了,这工作太TM的庞大了!
不过后来我发现了一款Android Studio的小插件,简直是神器,上面说的两个工作它都能帮你完成了.
Android Parcelable代码自动生成插件 Parcelable code generator
小奋斗文章
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~