Android Bundle是分享内存吗?

时间:2014-02-18 02:17:39

标签: java android

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

我使用Bundle.putParcelableArrayList()将ArrayList存储到bundle中, 我创建了他们 - 推测数据和获取数据 - 等于内存。

一般来说,我认为,Parcelable源和重新生成(通过CREATOR)实例是另一个实例,但它们是相同的。

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

2 个答案:

答案 0 :(得分:0)

  

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

如果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 Framework来避免上述问题。

答案 1 :(得分:0)

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

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