2011-08-30 65 views
2

我知道这个问题已经被问过很多次了,并且我经历了很多这些问题......几乎所有这些问题都会抛出对您的课程使用parcelable接口。 然而,在一对夫妇的问题,我碰到一个报价:在应用程序中,在活动之间传递自定义对象的最佳方式是什么?

“注意:看Parcelable可能引发的问题,为什么Android的未使用 内置Java序列化机制事实证明,Android团队来的?到 的结论是:中的序列化太慢,不足以满足Android的进程间通信 的要求,所以团队构建了Parcelable解决方案 Parcelable方法要求 明确地序列化类的成员,但是在最后,你会得到一个更快的 序列化你的对象。 也意识到,Android提供两种机制允许您将数据传递给另一个 进程。第一种方法是使用意图将捆绑传递给活动,第二种方法是将Parcelable传递给服务。 这两种机制不可互换,不应该被 搞糊涂了。也就是说,Parcelable并不意味着被传递给一个活动。如果您想要启动 活动并将其传递给一些数据,请使用一个包。 Parcelable旨在仅作为的 的AIDL定义的一部分“。

这句话也可以在书临的Android 2.

现在看到的被发现,在相同的同一应用程序运行的所有活动进程(Every Activity in Android is a Process,or One Application is one process),除非清单中另有规定,否则同一应用程序的活动内部的通信本身不是进程间通信。所以使用parcelable类真的更快,或者它足以通过bundle传递对象属性意向?

在这方面脱落任何光将大大赞赏。 干杯!

+0

我个人使用,从应用扩展类,并将其作为静态也许这是不是最好的做法,但它的伟大工程。 – PedroAGSantos

回答

8

对此,有一个FAQ。 :)

简短的回答是,Android团队推荐三种技术在应用程序中的活动和服务之间传递数据:单例类;公共静态字段或方法;对象的弱引用的HashMap(并且你在意图中传递密钥)。需要记住的主要问题是您的数据在各种生命周期事件下的表现如何。 (例如,如果用户打开手机,默认情况下,您的活动将被销毁并重新创建;您的数据处理方法需要设计时考虑到这一点。)

+0

ty !!非常有价值! – Ashwin

5

Parcelable构造被设计为在跨应用程序内存边界传递数据时非常快速:在应用程序中,您使用Bundle更好地服务Bundle,因为数据存储在内的所有内存位置均可供发送方和接收方访问。由于内存中的对象是可访问的,因此不需要承担重构的代价:只需使用Bundle,它实际上只是具有特定于类型的put/get方法而被优化的HashMap

对于AIDL和IPC目的,你不能(默认)共享存储位置,所以你需要移动数据的有效途径:这就是Parcelable踢除非你的应用程序的组件之一是使用remote过程。能力,那么就没有必要使用Parcelable

+0

我也这么认为!但泰德跳到那里提供了一个很好的链接来解决它!反正干杯! – Ashwin

1

docs

Parcelables并

的Parcelable协议提供对象写入和从 包裹读本身是一种非常有效的(但 低级别)协议。您可以使用直接的方法writeParcelable(Parcelable, int)和readParcelable器(classloader)或writeParcelableArray(T [],INT) 和readParcelableArray器(classloader)写入或读取。这些方法 写两个类的类型和它的数据到包裹,允许该 类从适当的类加载器,当以后 读数进行重构。

也有一些方法提供一种更有效的方式工作 与Parcelables并:writeTypedArray(T [],INT),writeTypedList(列表), readTypedArray(T [],Parcelable.Creator)和readTypedList(列表, Parcelable.Creator)。这些方法不会写入原始对象的类信息 :相反,读取函数的调用者必须知道需要什么类型,并在相应的Parcel.Creator中传递,而不是正确构造新对象,并且读取其数据(请参阅 ) 。 (为了更高效的写入和读取单个Parceable 对象,你可以直接调用Parcelable.writeToParcel和 Parcelable.Creator.createFromParcel自己。)

捆绑

一种特殊类型安全的容器,被称为捆绑,可用于 异质值的键/值映射。读取和写入数据时,这对提高性能许多优化 ,其 类型安全的API避免了难以调试类型错误时,终于 编组的数据内容为一个包裹。使用的方法是 writeBundle(束),readBundle(),和readBundle(类加载器)。

相关问题