繁体   English   中英

Android Bundle是否共享内存?

[英]Android Bundle is shares memory?

我使用setArgument()/ getArgument()将数据从一个片段传递到另一个片段。

我使用Bundle.putParcelableArrayList()将ArrayList存储到bundle中,然后我发现它们-放入数据和获取数据-等于内存。

通常,我认为,可打包源和通过CREATOR再生的实例是另一个实例,但是它们是相同的。

如果Bundle共享内存,那么为什么bundle有几种支持多种数据类型的方法-为什么不仅仅传递Object实例或在Bundle上使用泛型?

为什么bundle有几种支持多种数据类型的方法-为什么不仅仅传递Object实例或在Bundle上使用泛型?

如果Bundle类只有一种方法可以传递objects ,那就太可怕了,因为这可能会引起混乱。 这些多样化的数据类型方法可以帮助程序员确定他/她想要获取或放入的参数的种类。试想一下这种情况,其中有4位程序员在一个项目上工作,而有1位程序员想要在Bundle实例中放入一个对象(在本例中例如,假设Bundle类只有一种方法放置对象(多态)

Bundle bundle = new Bundle();
bundle.putObject("animal",new Dog());

然后,一位程序员想要获取该值并执行此操作:

Bundle bundle = getArguments();
Cat variable = bundle.getObject("animal"); //This will cause an Exception, because the     argument it returned isn't a Cat class.

这就是为什么Bundle类具有这些方法以避免此类错误的原因。

现在下一个答案是

或在Bundle上使用通用?

泛型是为了避免使用Casting,并帮助程序员使用Collection框架来避免上述问题。

public final class Bundle implements Parcelable, Cloneable {...} 

Bundle实现了Parcelable,系统将自动识别Bundle是否为跨进程,如果不是,则将数据直接通过共享内存传递,因此这次您将一个对象与该对象一起传递实际上是相同,但是如果是跨进程的,则Parcelable接口在跨进程中发挥作用,系统将调用Parcelable的writeToParcel方法,将所有数据转换为字节,然后传递给其他进程,之后再接收其他进程,然后通过Parcelable Creator界面还原数据,通过Creator还原数据肯定不是同一实例。 至于为什么有这么多的捆绑方式,而不是直接使用putObject(Object),getObject(),部分是因为需要Parcelable,不是每个类型都可以捆绑,所以Bundle既然实现了Parcelable,还必须是他需要传递捆绑数据要求也支持包裹

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM