android 自定义方形章,Android Activity间传自定义对象 Parcel代码自动生成工具

内容分享-->

我们知道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

小奋斗文章

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值