【问题标题】:Within an application what is the best way to pass custom objects between activities?在应用程序中,在活动之间传递自定义对象的最佳方式是什么?
【发布时间】:2011-11-06 13:14:21
【问题描述】:

我知道这个问题已经被问过很多次了,我也经历过很多这样的问题......几乎所有这些问题都与您的班级使用 parcelable 界面有关。 然而,在几个问题中,我遇到了一个引用:

“注意:看到 Parcelable 可能会引发问题,为什么 Android 不使用 内置Java序列化机制?原来Android团队得出了结论 Java 中的序列化速度太慢,无法满足 Android 的进程间通信 要求。因此团队构建了 Parcelable 解决方案。 Parcelable 方法需要 你明确地序列化你的类的成员,但最后,你会得到一个更快的 对象的序列化。 还要意识到 Android 提供了两种机制允许您将数据传递给另一个 过程。第一种是使用意图将捆绑包传递给活动,第二种是通过 可打包到服务。 这两种机制不可互换,也不应 使困惑。也就是说,Parcelable 并不意味着传递给活动。 如果你想开始 一个活动并传递一些数据,使用一个包。 Parcelable 仅用作 AIDL 定义。”

这句话也可以在 Pro Android 2 一书中找到。

现在看到同一个应用程序内的所有活动都在同一个进程中运行(Every Activity in Android is a Process,or One Application is one process),除非清单中另有说明,否则同一个应用程序的活动内的通信本身并不是进程间通信。那么它真的更快吗使用 parcelable 类,还是通过意图通过 bundle 传递对象属性就足够了?

我们将非常感谢您对这方面的任何了解。 干杯!!

【问题讨论】:

  • 我个人使用从应用程序扩展的类并将它们存储为静态也许这不是最佳实践,但效果很好。

标签: android


【解决方案1】:

来自docs

包裹

Parcelable 协议提供了一种极其高效(但 低级)协议,用于对象自己读写 包裹。您可以使用直接方法 writeParcelable(Parcelable, int) 和 readParcelable(ClassLoader) 或 writeParcelableArray(T[], int) 和 readParcelableArray(ClassLoader) 写入或读取。这些方法 将类类型及其数据写入 Parcel,允许 稍后从适当的类加载器中重建的类 阅读。

还有一些方法可以提供更有效的工作方式 使用 Parcelables:writeTypedArray(T[], int), writeTypedList(List), readTypedArray(T[], Parcelable.Creator) 和 readTypedList(List, Parcelable.Creator)。这些方法不写类信息 原始对象的:相反,读取函数的调用者必须 知道期望什么类型并传入适当的 Parcelable.Creator 而是正确构造新对象并 读取它的数据。 (为了更高效地写入和读取单个 Parceable 对象,你可以直接调用 Parcelable.writeToParcel 和 Parcelable.Creator.createFromParcel 自己。)

捆绑包

一个特殊的类型安全容器,称为 Bundle,可用于 异构值的键/值映射。这有很多优化 用于提高读写数据时的性能,及其 类型安全的 API 在 finally 时避免了难以调试的类型错误 将数据内容编组到 Parcel 中。使用的方法是 writeBundle(Bundle)、readBundle() 和 readBundle(ClassLoader)。

【讨论】:

    【解决方案2】:

    为此有一个FAQ。 :)

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

    【讨论】:

    • @ted...我正在使用静态字段在所有活动和服务之间传递数据。它工作正常...我不知道这是一个更好的方法。你能指导我吗
    • @SyedDanishHaider - 这是谷歌推荐的技术之一。如果它工作正常,我会说不要费心去寻找更好的方法。有一句美国谚语:If it ain't broke, don't fix it. 听起来好像也适用于这里。
    • 是的,它工作正常,但我从很多人那里听说过它不是更好的方法。
    • @SyedDanishHaider - 我发现使用静态字段只有两个问题。首先,只要将具有该字段的类加载到内存中,该字段值就不会受到垃圾回收。如果您不再需要该值,则必须手动将该字段设置为null。其次,您必须计划当应用程序在后台时系统会终止您的进程,并且当应用程序再次启动时您必须重新初始化该字段。只要您的代码解决了这两个问题,就不需要更好的方法。
    【解决方案3】:

    Parcelable 构造旨在非常快速地跨应用程序内存边界传递数据:在应用程序中,使用 Bundle 可以更好地为您服务,因为发送方和接收方都可以访问存储数据的所有内存位置接收者。由于内存中的对象是可访问的,因此无需承担重建成本:只需使用 Bundle,它实际上只是一个美化的 HashMap 与特定类型的 put/get 方法。

    出于 AIDL 和 IPC 的目的,您不能(默认情况下)共享内存位置,因此您需要一种有效的数据移动方式:这就是 Parcelable 发挥作用的地方。除非您的应用程序的组件之一使用 @ 987654324@处理能力则不用Parcelable

    【讨论】:

    • 我也是这么想的!但是 Ted hop up there 提供了一个很好的链接来解决它!无论如何干杯!
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2019-11-20
    相关资源
    最近更新 更多