【问题标题】:Is it possible to pass an array of Objects through a bundle?是否可以通过捆绑传递对象数组?
【发布时间】:2013-08-19 04:38:34
【问题描述】:

我有一个与this guy 类似的问题,但略有不同。在最初的问题中,他说

假设你想开始一个新的活动,并从它传递一些数据 当前活动。

第一个答案是关于把东西放在 Extras 中,所以大概他在谈论传递 Intents。

但是,如果您只想在同一活动的两个实例之间传递怎么办?例如,如果您旋转屏幕,活动的“旧”实例将被销毁并创建一个“新”实例。在它们之间传递信息的方式是通过 Bundle。我知道如何使用 onSaveInstanceState.putXXX 和 .getXXX 传递原始数据类型。但是如果我有一个对象数组怎么办?我怎样才能在捆绑中传递这些? Parcelable 和 Serializeable 是我唯一的选择吗?*

*假设我不想使用静态变量

【问题讨论】:

  • ParcelableSerializeable 是我唯一的选择吗?” - 简而言之:是的。但是,由于 Parcelable 的性能优于 Serializable(它是专门为高性能 IPC 创建的),因此在实现开销方面值得付出额外努力,尤其是如果您计划传递数据.

标签: android bundle


【解决方案1】:

基本上我们有几个选择。

选项 1 是使用Activity.onSaveInstanceState() 方法。在那里,您将所有内容存储到 Bundle 类的实例中。 Bundle 需要简单、可打包或可序列化的类型。你也可以传递数组,但必须是这些类型的数组。

选项 2 将覆盖 Activity.onRetainCustomNonConfigurationInstance() 并从那里返回您的数组。此活动的新实例可以通过调用Activity.getLastNonConfigurationInstance() 来检索此数组。尽管此选项工作正常,但它已被弃用。这就是第三个选项发挥作用的地方。

选项 3 是使用保留的 Fragment。这里的想法是创建一个片段并在该片段的 onCreate() 或 onCreateView() 中调用Fragment.setRetaineInstance(true)。一旦被调用,这个片段就会被“保留”。如果您旋转您的设备,那么每次新的旋转都会创建新的活动实例,但是保留片段的相同实例将被传递给活动的每个新实例。如果您将阵列保留在那里,它将立即在每个新活动实例中可用。这将是一条路。

我想指出,选项 1 是持久的。如果您的应用程序进入后台并且 Android 将其杀死并稍后再次启动,您将把您的数组传递给 onCreate(Bundle savedInstanceState)。与此相反,选项 2 和 3 将失去状态。如果您可以在每次创建活动时重新创建数组,则可以使用选项 2 或 3。

【讨论】:

  • 选项 1 最终成为最好的。我需要坚持。我意识到只要我的对象implements Serialiable 我就可以了
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2020-12-27
相关资源
最近更新 更多